[comp.unix.microport] Graphics Library

lewis@m2-net.UUCP (Dave Lewis) (07/01/88)

> 
> A library of graphics primitives for System V/AT (and probably any
> other Intel unix, with a bit of hacking) is now available, supporting
> common video cards and printers.  Demonstration programs are included
> with the code.
> 
> Please contact me by e-mail if you would like a copy.  If there is 
> sufficient interest, I will post source (about 130K bytes).
> 
> 	-Dave Lewis
> 

I have received enough requests to justify posting the code for this.
The code is pretty well tested on various uPort 286 configurations
(with CGA, EGA, Hercules, and dot matrix printers).  I would particularly
appreciate it if any users of Xenix 286, Venix, and the various 386 unices 
could try this out and send me the needed changes.  As soon as we have
this running on several flavors of Intel Unix, it may be appropriate
to post to the archives (yes? no? comments?).  Thanks.

			Dave Lewis
			Ann Arbor, MI
			...![ itivax umix ]!m-net!dtlewis!lewis

------------------------------  cut here  ------------------------------
# To recover, type "sh archive"
echo restoring Readme
sed 's/^X//' > Readme <<XxX--EOF--XxX
X
XGraphics library for System V/AT
X--------------------------------
X
XThis collection of routines is designed to provide graphic output to
Xa number of video adapters and printers for PC/AT class computers running
Xunder Microport System V/AT (r).  Various output devices are supported.
XFor each type of device, one or more graphics "modes" is defined in
Xgraphics.h, and the corresponding bitmaps are defined in bitmaps.h.
XThese modes roughly correspond to the BIOS video modes defined for MS-DOS,
Xwith additional modes defined for Hercules (r) and for printer output.
X
XThe routines are:
X
X	init()		Initialize device, buffers, variables.  Attach
X			to shared memory segment or malloc'ed buffers.
X	finish()	Release resources, detach segments.
X	clear()		Clear screen.
X	write_pix()	Turn one pixel on.
X	movpen()	Move logical cursor in 32768 x 32768 address space.
X	draw()		Draw vector.	
X	linedraw()	Draw line.
X	box()		Draw box.
X	grafchar()	Display a vectorized text character (stroke font).
X	grafstr()	Display a character string, stroke font.
X	cellchar()	Display a bit mapped character.
X	cellstr()	Display a string, bit mapped characters.
X	cursor()	Move to character column and row for cellstr().
X	pix_mode()	Establish OR mode or XOR mode pixel setting, returns
X			previous mode value.
X	pix_color()	Set pixel color, returns previous color value.
X
XCurrently supported devices are Hercules mono, CGA, EGA (currently mono only),
Xand dot matrix printers (IBM, IBM Proprinter, Epson FX85, Star10X, Tandy 
XDMP130, and probably others).  Additional device support is straightforward, 
Xas all routines call write_pix() to do output.
X
X
XRequirements:
X-------------
X
X1)  A graphics capable video adapter and/or printer (see above for supported
Xdevices).  
X
X2)  An entry in /etc/rc.d/shm.rc to define the shared memory key for your
Xgraphics board.  A sample entry for EGA is:
X
X	/etc/shmcreate 0xa0000 a0000 65535		# ega high res
X
X3)  A program or shell script which will cause the graphics adapter to
Xswitch from text to graphics modes, and vice versa.  For most configurations,
Xthis can be just a shell script which echoes the appropriate escape sequences
Xto the console.  The mode.sh script is supplied for this purpose, but
Xshould be tested and modified as needed for your system. The program
Xmode.c is also supplied for use with the Everex Edge.  This program can
Xbe modified to support various other video adapters which may not respond
Xto the console escape sequences (mode.c probably works with a Hercules
Xboard, also, but this is not tested).  Mode.c needs to be suid to root
Xand placed in an appropriate safe directory, but a simple shell script
Xwill need no special treatment.    
X
X4)  For graphics printing, the printer driver must be in "transparency"
Xmode.  This is done with the "lpget" and "lpset" commands.  The plotting
Xroutines do not set this for you, since the printer is on a queue and
Xis assumed to be a shared device.  If more than one person uses the
Xprinter, it would be a good idea to leave the driver in transparency
Xmode, and write a filter for normal text line printer output to handle
Xconversion of <lf> to <cr><lf> along with any other output formatting that 
Xmay be required for text.  An alternative method, based on an undocumented
Xfeature of the lp driver, is to use minor numbers 128 and 129 of the lp
Xdriver, rather than 0 and 1.  This device will correspond to the transparent
Xmode of the lp device driver.  The commands "mknod /dev/lpt0 c 0 128",
X"link /dev/lpt0 /dev/lpt", "lpadmin -plpt -v/dev/lpt -elp", "enable lpt"
Xand "/usr/lib/accept lpt" may be used to set this up (you may need to
Xuse "mknod /dev/lpt1 c 0 129" and "link /dev/lpt0 /dev/lpt", depending on
Xwhich printer port you are using.  The lp command then becomes "lp -dlp"
X(set PRINTPROG in graphics.h accordingly).  If the environment variable
X"PLOTDEV" is defined, it will be used as the name of the output printer
X(e.g. "PLOTDEV=lpt; export PLOTDEV" to use the transparent printer device).
X
X
XHow it works:
X-------------
X
XInit() attaches the shared memory segment for your video board to your
Xprocess address space.  The pointer to this memory segment is used for
Xdirect read and write access to bit mapped graphics.  In the case of
Xa printer, init() simply allocates some memory buffers which it 
Xtreats like the bit map for the printer, then adds some escape codes
Xand spools the whole mess off to the lp program.
X
XThe screen (or printer page) is represented by a normalized address
Xspace of 32768 by 32768.  This gives a reasonable amount of resolution,
Xand allows valid addresses to be represented by non-negative short integers,
Xgiving efficient calculations and easy checking for addresses that would
Xbe "off the edge of the screen."  All of the output routines, except
Xwrite_pix(), use this normalized address space, regardless of the pixel
Xaspect ratio or the aspect ratio of the physical screen.  
X
XThe write_pix() routine uses physical pixel coordinates (row,col)
Xto access one pixel on the graphics device.  All output, whether lines,
Xdots or text, use the write_pix() routine at the lowest level.  In
Xthis way, all knowledge of the display bit map, interleaving and 
Xsegmentation are localized to the write_pix() routine.  To add support
Xfor a new device type, only write_pix() is changed, along with the
Xappropriate parameters in bitmaps.h and the init() and finish() routines
X(for initializing and releasing graphics resources, respectively).
X
XPositioning on the screen is done with a "graphics cursor," which
Xis used to position all graphics and text output.  The cursor is
Xpositioned in normalized coordinates using the movepen() routine.
XRoutines such as draw() cause the cursor to be moved to new positions.
X
XThe box() and linedraw() routines, as well as the stroke font text,
Xcall movepen() and draw() to position the cursor and draw a vector, 
Xrespectively.  This is the basis of all the graphical output, with
Xthe low level output handled by write_pix().
X
XTwo types of text output are supported.  A stroke font is invoked by
Xgrafstr(), and a bit cell font is invoked by cellstr().  Grafchar()
Xand cellchar() are single character versions which should normally
Xnot be directly called (just use the grafstr() and cellstr() versions).
XCursor() is used to position the graphics cursor in terms of character
Xrows and columns, as if it were a text cursor.
X
XThe finish() routine detaches shared memory, frees resources, and 
Xsends any output to the print queue.
X
XAll routines are written in C (no assembler at all) and use short integer
Xarithmetic wherever possible.  Long integers are used when more accuracy
Xis required, and floats and doubles are avoided wherever possible.  The
Xoverall performance is quite acceptable, even for text output, and is 
Xin fact considerably faster than similar code under MS-DOS using BIOS
Xrather than write_pix().  The development machine for this code is a
X6 MHz Zenith 241 with no 80287 coprocessor, hence the avoidance of floating
Xpoint math.
X
XBugs:
X-----
X
XPix_mode() does not set XOR mode for EGA high res graphics.  
XPix_color() does not do anything for EGA high res graphics.
X
XLimitations:
X------------
X
XNo checking is done to control ownership of the console output.  The
Xuser of the program is assumed to be at the console.  Any checks for
Xthis would have to be done by an application program using these
Xroutines.
X
XThe EGA and VGA adapters control color and writing modes (OR or XOR)
Xwith output to port addresses on the EGA/VGA card.  On System V/AT,
Xthis requires use of the outb() subroutine with write access to /dev/mem.
XSince this would require the application program to be suid to root,
Xsupport for color and writing modes has not yet been implemented.
X
XThese routines have been tested by the author only on an Everex Edge
Xvideo card, emulating CGA modes 4 and 6, and Hercules graphics.  Printer
Xoutput has been tested only on a Tandy DMP 130 (IBM printer mode).  
XOther users have verified EGA mode and various printers.
X
XThe graphics.h file has declarations for parameters that will be used
Xfor various coordinate transformations.  However, none of this is
Ximplemented at the present time.  The only coordinate system which the
Xapplication program should refer to is the normalized 2-D space used
Xto represent the screen.  It is important to realize that even an object
Xas simple as a circle will require additional coordinate transformations
Xto handle aspect ratio.
X
XCredits:
X--------
X
XThanks to John Antypas, Denis Fortin and Bill Rankin for assistance in
Xtesting and developing the code.  
X
XThe font.h and cellfont.h files contain data for stroke fonts and bit cell
Xfonts, respectively.  The copyright status of this data is uncertain.
XThe stroke font is taken from _Advanced_Graphics_in_C_, by Nelson
XJohnson (McGraw-Hill, 1987).  The copyright notice for this book specifically
Xallows copying of the code, but does not say if you need to have purchased
Xthe book to be so entitled.  I recommend the book, in any case, so you may
Xwish to buy a copy.  The bit cell font was received third or fourth hand,
Xand is presumed public domain unless I hear otherwise.  The name at the
Xhead of the data file is:
X[
X	/* RAM-Loadable Character Sets for the IBM PC
X	 Richard Wilton
X	 July 1986 */
X
XIn any case, if you can locate the font data in your machine's BIOS, you
Xcan use that instead, and you are presumably licenced to do so by virtue
Xhaving bought the machine.
X
XThe setmode.c code comes from Jeff Turner, and was posted to the net
Xa while back.  It has been modified by me for Everex Edge and Hercules
Xgraphics, and is presumed in the public domain.  
X
XThe rest of the material is copyrighted by me, but may be used and
Xcopied by anybody, as long as it is not used for commercial profit.
XI would very much appreciate hearing about any bug fixes and new 
Xdevice support that may be forthcoming.  Thanks. 
X
X
X				David T. Lewis  
X				umix!m-net!dtlewis!lewis
X				122 S. Seventh
X				Ann Arbor MI  48103
X
X				system5 dtlewis 2 2.3.0-U AT
X				Wed Jun 29 23:48:47 EDT 1988
X
X
X
XxX--EOF--XxX
echo restoring Things_to_do
sed 's/^X//' > Things_to_do <<XxX--EOF--XxX
XThings that need to be added to enhance the graphics routines:
X
X
XVolunteers needed:
X------------------
X
X-Test and/or port to uPort 386 unix.  I don't know if this works
Xlike the 286 version or not.  
X
X-Port to Xenix 286 and 386.  This will require someone with a Xenix
Xsystem to figure out how to get a pointer to video memory (this is
Xreputedly explained in the screen(HW) section of the manual), and add
Xsome suitable #ifdef code in init.c and finish.c.  We also will need 
Xto make an appropriate mode changing script (using the stty command, 
XI think).  
X
X-Add additional device support (VGA, Laserjet, enhanced EGA boards).
X
X
XThings I'll probably get around to doing myself:
X------------------------------------------------
X
X-Add XOR and color support to EGA.
X
X-Add polygon fill routines.
X
X-Add circle/ellipse routines.
X
X-Get plot(3) and plot(1) working.
X
X-Add windows, viewports, 3-D transforms, etc.
X
X
X
X			Wed Jun 29 23:53:34 EDT 1988 dtl
X
XxX--EOF--XxX
echo restoring graphics.1
sed 's/^X//' > graphics.1 <<XxX--EOF--XxX
X.\" dummy line
X.TH GRAPHICS 3 "29 June 1988"
X.UC 4
X.SH NAME
Xinit, finish, clear, write_pix, movpen, draw, linedraw, box,
Xgrafchar, grafstr, cellchar, cellstr, cursor, pix_mode, pix_color
X\- graphics primitives for pc clone unix systems.
X.SH SYNOPSIS
X.nf
X.B int init(mode)
Xint mode;
X.PP
X.B int finish()
X.PP
X.B int clear()
X.PP
X.B int write_pix(x,y)
Xint x, y;
X.PP
X.B int movpen(x,y)
Xint x, y;
X.PP
X.B int draw(x,y)
Xint x, y;
X.PP
X.B int linedraw(x1,y1,x2,y2)
Xint x1, y1, x2, y2;
X.PP
X.B int box(x1, y1, x2, y2)
Xint x1, y1, x2, y2;
X.PP
X.B int grafchar(asc_char,x,y,vsize,hsize)
Xunsigned char asc_char;
Xint x, y, vsize, hisize;
X.PP
X.B int grafstr(strng,x,y,vsize,hsize,spacing)  
Xchar strng[];
Xint x, y, vsize, hsize, spacing;
X.PP
X.B int cellchar(asc_char)
Xunsigned char asc_char;
X.PP
X.B int cellstr(strng)
Xchar strng[];
X.PP
X.B int cursor(row,col)
Xint row, col;
X.PP
X.B enum PIX_MODE {OR, XOR} pix_mode(mode_val)
Xenum PIX_MODE mode_val;
X.PP
X.B int pix_color(color)
Xint color;
X.br
X.SH DESCRIPTION
XThis collection of routines is designed to provide graphic output
Xto a number of video adapters and printers for PC clone computers
Xrunning unix operating systems.  
X.PP
XVarious output devices are supported, including CGA, EGA, Hercules 
Xand dot matrix printers.  For each type of device, one or more 
Xgraphics "modes" is defined in graphics.h, and the corresponding 
Xbitmaps are defined in bitmaps.h.  These modes roughly correspond 
Xto the BIOS video modes defined for MS-DOS, with additional modes 
Xdefined for Hercules and for printer output.
X.PP
XThe
X.I init
Xroutine initializes device, buffers, variables, and attaches 
Xshared memory segment or malloc'ed buffers to the calling process.
X.PP
XThe
X.I finish
Xroutine releases resources and detaches memory segments.
X.PP
XThe
X.I clear
Xroutine clears the screen (or printer buffer area). 
X.PP
XThe
X.I write_pix
Xroutine activates a pixel.  If the current writing mode is OR, 
Xthe pixel is turned on (set to the currently active color).  If 
Xthe current writing mode is XOR, the pixel value (color) is XORed 
Xwith its current value.
X.PP
XThe
X.I movpen
Xroutine moves the logical cursor in normalized 32768 x 32768 
Xaddress space, where (0,0) is the upper left corner of the screen
Xor printed page.
X.PP
XThe
X.I draw
Xroutine draws a vector from the current address to (x,y) in 
Xnormalized address space.
X.PP
XThe
X.I linedraw
Xroutine draws a line from (x1,y1) to (x2,y2) in normalized address 
Xspace.
X.PP
XThe
X.I box
Xroutine draws a box with corners at (x1, y1) and (x2, y2) in 
Xnormalized address space.
X.PP
XThe
X.I grafchar
Xroutine displays a vectorized (stroke font) text character 
Xasc_char located at (x,y), of height vsize by width hsize.
X.PP
XThe
X.I grafstr
Xroutine displays a character string using a stroke font.
X.PP
XThe
X.I cellchar
Xroutine displays a bit mapped character at the current location.
X.PP
XThe
X.I cellstr
Xroutine displays a string at the current location, using bit mapped 
Xcharacters.
X.PP
XThe
X.I cursor
Xroutine moves the graphics cursor to a position corresponding to
Xa character row and column.  This is used for easy positioning of text
Xdrawn with the 
X.I cellstr 
Xroutine.
X.PP
XThe
X.I pix_mode
Xroutine establishes the active OR mode or XOR mode pixel 
Xsetting mode, and returns the previous mode value.
X.PP
XThe
X.I pix_color
Xroutine sets the active pixel color, and returns previous color 
Xvalue.
X.SH AUTHOR
XDavid T Lewis, Ann Arbor, MI, USA
X.br
X(...!m-net!dtlewis!lewis)
X.SH BUGS
XThe 
X.I pix_mode
Xroutine does not set XOR mode for EGA high res graphics.  
X.PP
XThe
X.I pix_color 
Xroutine does not do anything for EGA high res graphics.
X.SH CAVEATS
XNo checking is done to control ownership of the console output.  The
Xuser of the program is assumed to be at the console.  Any checks for
Xthis must be done by the application program.
X.PP
XThe EGA and VGA adapters control color and writing modes (OR or XOR)
Xwith output to port addresses on the EGA/VGA card.  On System V/AT,
Xthis requires use of the outb() routine with write access to /dev/mem.
XSince this would require the application program to be suid to root,
Xsupport for color and writing modes has not yet been implemented.
X
XxX--EOF--XxX
echo restoring xdemo.c
sed 's/^X//' > xdemo.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) xdemo.c 1.9 88/06/20";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Cheap clone of an attention getting program I saw on a Xerox workstation.*/
X/* system5 dtlewis 2 2.3.0-U AT */
X/* Tue May 24 22:38:22 EDT 1988 */
X/* by Dave Lewis */
X
X#include <signal.h>
X#include <stdio.h>
X#include <time.h>
X#include "graphics.h"
X#define MAXINT 32767
X#define NUMLINES 32
X
X#define MSG_COUNT 20
X
Xint init();
Xint linedraw();
Xint finish();
Xenum PIX_MODE pix_mode();
Xint pix_color();
Xint clear();
Xint grafstr();
X
Xvoid sig_catch() {
X	/* Clean up and exit. */
X	finish();
X	system("mode 2");
X	exit(0);
X}
X
Xstatic int msg_count = 0;
Xvoid message()  {
X	/* Write a cute message every time we get a time signal. */
X	int save_color;
X	enum PIX_MODE save_pix_mode;
X	save_color = pix_color(3);
X	save_pix_mode = pix_mode(XOR);
X	cursor(2,2);
X	cellstr("Press <Del> to quit...");
X	pix_color(save_color);
X	pix_mode(save_pix_mode);
X	if (msg_count < MSG_COUNT)  {
X		/* Do it MSG_COUNT times, then stop. */
X		signal(SIGALRM,message);
X		alarm(1);
X		msg_count++;
X	}
X}
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
Xchar buffer[80];
Xint mode = 8;
Xlong x1;
Xlong y1;
Xlong x2;
Xlong y2;
Xint x1rate;
Xint y1rate;
Xint x2rate;
Xint y2rate;
Xlong timeval;
Xlong time();
Xstruct tm *timestruct;
Xstruct tm *gmtime();
Xvoid srand();
Xint rand();
Xint (*signal ())();
X
Xstruct endpoints {
X	int x1;
X	int x2;
X	int y1;
X	int y2;
X} buff[NUMLINES]; 
X
Xint idx_to_buff, idx;
X
X/* Initialize the line buffer to invalid values (so they don't get plotted). */
X
Xfor (idx_to_buff=0; idx_to_buff < NUMLINES; idx_to_buff++)  {
X	buff[idx_to_buff].x1 = -1;
X	buff[idx_to_buff].y1 = -1;
X	buff[idx_to_buff].x2 = -1;
X	buff[idx_to_buff].y2 = -1;
X	}
Xidx_to_buff = 0;
X
X/* Get the mode to use. */
Xif (argc == 2)  {
X	mode = 0;
X	mode = *(argv[1]) - '0';
X	init(mode);
X	strcpy(buffer,"mode ");
X	strcat(buffer,argv[1]);
X	system(buffer);
X	}
Xelse {
X	printf("usage:  xdemo mode\n\n	mode = {4,6,8,16}\n\nAssuming CGA hi-res graphics mode...",0);
X	init(6);
X	system("mode 6");
X	}
X
X/* Clear the video display. */
Xclear();
X
X/* Get the current time, and use it as a seed value for the rand() function. */
Xtimeval = time((long *) 0);
Xtimestruct = gmtime(&timeval);
Xsrand((unsigned)timestruct->tm_sec);
X
X/* Modify the slopes and starting location of the endpoint motion, to give */
X/* different patterns every time we run the program.	*/
Xx1 = rand();
Xy1 = rand();
Xx2 = rand();
Xy2 = rand();
Xx1rate = rand() & 0x0FF + 256;
Xy1rate = rand() & 0x0FF + 256;
Xx2rate = rand() & 0x0FF + 256;
Xy2rate = rand() & 0x0FF + 256;
Xif (rand() & 0x01) x1rate *= -1;
Xif (rand() & 0x01) y1rate *= -1;
Xif (rand() & 0x01) x2rate *= -1;
Xif (rand() & 0x01) y2rate *= -1;
X
X/* Draw a border and a text message. */
Xpix_color(3);
Xbox(0,0,32767,32767);
Xgrafstr("XOR Write Mode",10000,31000,220,120,800);
Xpix_color(1);
Xlinedraw(16383,6000,16383,26767);
Xlinedraw(6000,16383,26767,16383);
Xpix_color(2);
X
X/* Set for XOR mode. */
Xpix_mode(XOR);
X
X/* Fork and start flashing a cute message. */
Xif (fork())  {
X	/* Child process here. */
X	/* Set a timer to post message. */
X	signal(SIGALRM,message);
X	alarm(3);
X	for(;;) pause();
X}
X
X/* Parent process continues here. */
X
X/* Catch interrupt signals. */
Xsignal (SIGINT, sig_catch);
X
X/* Loop for a while. */
Xwhile (msg_count < MSG_COUNT)  {
X
X	/* Increment buffer pointer, wrapping around buffer. */
X	++idx_to_buff;
X	idx_to_buff %= NUMLINES;
X
X	/* Erase (redraw in XOR mode) old line. */
X	linedraw( buff[idx_to_buff].x1, 
X		buff[idx_to_buff].y1, 
X		buff[idx_to_buff].x2, 
X		buff[idx_to_buff].y2
X		);
X
X	/* Get coordinates of new line. */
X	if (((x1 += x1rate) < 0) || (x1 > MAXINT))  { 
X		x1rate *= -1;
X		x1 += (2 * x1rate);
X		}
X	if (((y1 += y1rate) < 0) || (y1 > MAXINT))  {
X		y1rate *= -1;
X		y1 += (2 * y1rate);
X		}
X	if (((x2 += x2rate) < 0) || (x2 > MAXINT))  {
X		x2rate *= -1;
X		x2 += (2 * x2rate);
X		}
X	if (((y2 += y2rate) < 0) || (y2 > MAXINT))  {
X		y2rate *= -1;
X		y2 += (2 * y2rate);
X		}
X
X	/* Store it in buffer. */
X	buff[idx_to_buff].x1 = x1;
X	buff[idx_to_buff].y1 = y1;
X	buff[idx_to_buff].x2 = x2;
X	buff[idx_to_buff].y2 = y2;
X
X	/* Draw new line. */
X	linedraw( buff[idx_to_buff].x1, 
X		buff[idx_to_buff].y1, 
X		buff[idx_to_buff].x2, 
X		buff[idx_to_buff].y2
X		);
X	}
X
X/* Restart the pattern. */
X
Xfor (idx_to_buff=0; idx_to_buff < NUMLINES; idx_to_buff++)  {
X	buff[idx_to_buff].x1 = -1;
X	buff[idx_to_buff].y1 = -1;
X	buff[idx_to_buff].x2 = -1;
X	buff[idx_to_buff].y2 = -1;
X	}
X
Xidx_to_buff = 0;
X
Xclear();
X
X/* Loop until <del> key is pressed. */
Xfor (;;)  {
X
X	/* Increment buffer pointer, wrapping around buffer. */
X	++idx_to_buff;
X	idx_to_buff %= NUMLINES;
X
X	/* Erase (redraw in XOR mode) old line. */
X	linedraw( buff[idx_to_buff].x1, 
X		buff[idx_to_buff].y1, 
X		buff[idx_to_buff].x2, 
X		buff[idx_to_buff].y2
X		);
X
X	/* Get coordinates of new line. */
X	if (((x1 += x1rate) < 0) || (x1 > MAXINT))  { 
X		x1rate *= -1;
X		x1 += (2 * x1rate);
X		}
X	if (((y1 += y1rate) < 0) || (y1 > MAXINT))  {
X		y1rate *= -1;
X		y1 += (2 * y1rate);
X		}
X	if (((x2 += x2rate) < 0) || (x2 > MAXINT))  {
X		x2rate *= -1;
X		x2 += (2 * x2rate);
X		}
X	if (((y2 += y2rate) < 0) || (y2 > MAXINT))  {
X		y2rate *= -1;
X		y2 += (2 * y2rate);
X		}
X
X	/* Store it in buffer. */
X	buff[idx_to_buff].x1 = x1;
X	buff[idx_to_buff].y1 = y1;
X	buff[idx_to_buff].x2 = x2;
X	buff[idx_to_buff].y2 = y2;
X
X	/* Draw new line. */
X	linedraw( buff[idx_to_buff].x1, 
X		buff[idx_to_buff].y1, 
X		buff[idx_to_buff].x2, 
X		buff[idx_to_buff].y2
X		);
X	}
X}
XxX--EOF--XxX
-- 
Dave Lewis
Ann Arbor, MI
...![ itivax umix ]!m-net!dtlewis!lewis

lewis@m2-net.UUCP (Dave Lewis) (07/01/88)

------------------------------  cut here  ------------------------------
# To recover, type "sh archive"
echo restoring box.c
sed 's/^X//' > box.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) box.c 4.3 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Fri Jul  3 23:43:36 EDT 1987
X * dtlewis
X * Routine to draw a box.
X */
X
Xint box(x1,y1,x2,y2)  
X	int x1, y1, x2, y2;
X{
X	int movepen(), draw();
X	if (movepen(x1,y1)) return(1);
X	if (draw(x2,y1)) return(1);
X	if (draw(x2,y2)) return(1);
X	if (draw(x1,y2)) return(1);
X	if (draw(x1,y1)) return(1);
X	return(0);
X}
XxX--EOF--XxX
echo restoring cellchar.c
sed 's/^X//' > cellchar.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) cellchar.c 4.4 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Write a graphics character to the screen.				*/
X/* This routine uses bit mapped character cell fonts.			*/
X/* The character will be drawn such that the current graphics cursor	*/
X/* denotes the upper left corner of the character cell.  The graphics	*/
X/* cursor will be incremented in the X direction by an amount corres-	*/
X/* ponding to one character cell.					*/
X
X/* x and y are in PIXEL COORDINATES, not normalized coordinates.	*/
X/* Tue Mar 15 22:46:31 EST 1988						*/
X/* system5 dtlewis 2 2.3.0-U AT						*/
X
X#include "graphics.h"
X#include "cellfont.h"
X
Xextern struct SVAT_graphics graphics;
X
Xint cellchar(asc_char)  
Xunsigned char asc_char;
X{
X	int x, y, i, j;
X	int write_pix();
X
X	char *bits; 
X
X	/* Get the pixel location, and check for Y out of range.	*/
X	x = conv_x_coord(graphics.x_cursor);
X	y = conv_y_coord(graphics.y_cursor);
X 	if ((y<0) || ((y + Y_CELL_BITS) >= graphics.y_extent)) return(1);
X
X	/* Increment the graphics cursor, check X range.		*/
X	if ((graphics.x_cursor += (int)(NORM_X_RANGE * X_CELL_BITS 
X		/ graphics.x_extent)) < 0)
X		return(1);
X
X	/* Point at the character bit map to print.			*/
X	bits = (char *) &(charcell[asc_char * Y_CELL_BITS]);
X
X	/* Write the character.						*/
X	for (i=y; i < y + Y_CELL_BITS; i++, bits++) {
X		j=x;
X		if (*bits & 0x80) if (write_pix(j,i)) return(1); j++;
X		if (*bits & 0x40) if (write_pix(j,i)) return(1); j++;
X		if (*bits & 0x20) if (write_pix(j,i)) return(1); j++;
X		if (*bits & 0x10) if (write_pix(j,i)) return(1); j++;
X		if (*bits & 0x08) if (write_pix(j,i)) return(1); j++;
X		if (*bits & 0x04) if (write_pix(j,i)) return(1); j++;
X		if (*bits & 0x02) if (write_pix(j,i)) return(1); j++;
X		if (*bits & 0x01) if (write_pix(j,i)) return(1); j++;
X	}
X
X	return(0);
X}
XxX--EOF--XxX
echo restoring cellstr.c
sed 's/^X//' > cellstr.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) cellstr.c 4.3 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Write string of a graphics characters to the screen.			*/
X/* Sat Mar 19 23:56:46 EST 1988						*/
X/* system5 dtlewis 2 2.3.0-U AT						*/
X
X/* Routine to display cell mode text string with upper left corner of	*/
X/* first character located at the current graphics cursor.  The cursor	*/
X/* is incremented as characters are written.				*/
X
X#include <stdio.h>
X
Xint cellstr(strng)  
Xchar strng[];
X{
X	int i;
X	int cellchar();
X	for(i=0; strng[i] != NULL; i++)  {
X		if (cellchar(strng[i])) return(1);
X	}
X	return(0);
X}
X
XxX--EOF--XxX
echo restoring clear.c
sed 's/^X//' > clear.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) clear.c 4.4 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/*
X *	Routine to clear video memory (or print buffer memory).  
X *	dtlewis 6-28-87
X *	Sun Mar 13 21:13:59 EST 1988
X */
X
X#include "graphics.h"
X
Xint clear()  
X{
X	extern struct SVAT_graphics graphics;
X	int i, j;
X	switch (graphics.grafmode) {
X		case CGA_COLOR_MODE:
X			for(i=0; i<100; i++)  {
X				for(j=0; j<80; j++)  {
X					(graphics.cgamem)->page1[i][j] = 0x0;
X					(graphics.cgamem)->page2[i][j] = 0x0;
X				}
X			}
X			break;
X
X		case CGA_HI_RES_MODE:
X			for(i=0; i<100; i++)  {
X				for(j=0; j<80; j++)  {
X					(graphics.cgamem)->page1[i][j] = 0x0;
X					(graphics.cgamem)->page2[i][j] = 0x0;
X				}
X			}
X			break;
X
X		case EGA_COLOR_MODE:
X			for (i=0 ; i<350 ; i++) {
X				for (j=0 ; j<80 ; j++) {
X					(graphics.egamem)->mem[i][j] = 0x0;
X				}
X			}
X			break;
X
X		case HERC_GRAF_MODE:
X			for(i=0; i<87; i++)  {
X				for(j=0; j<90; j++)  {
X					(graphics.hercmem)->page1[i][j] = 0x0;
X					(graphics.hercmem)->page2[i][j] = 0x0;
X					(graphics.hercmem)->page3[i][j] = 0x0;
X					(graphics.hercmem)->page4[i][j] = 0x0;
X				}
X			}
X			break;
X
X		case IBM_PRINTER:
X			for(i=0; i<PRINTLINES; i++)  {
X				for(j=0; j<PRINTDENSITY; j++)  {
X					(graphics.printbuf1)->buf[i][j] = 0x0;
X					(graphics.printbuf2)->buf[i][j] = 0x0;
X					(graphics.printbuf3)->buf[i][j] = 0x0;
X				}
X			}
X			break;
X
X		default:
X			return(1);
X
X	}
X	return(0);
X}
XxX--EOF--XxX
echo restoring cursor.c
sed 's/^X//' > cursor.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) cursor.c 4.3 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Move the graphics cursor as if it were a text cursor.  The cursor	*/
X/* is positioned such that a cell character may be drawn at the		*/
X/* specified character row and column.					*/
X/* This routine uses bit mapped character cell fonts.			*/
X/* The character will be drawn such that the current graphics cursor	*/
X/* denotes the upper left corner of the character cell.			*/
X
X/* Columns and rows are numbered 1 through N, not 0 through N !!!!	*/
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
Xextern int movepen();
X
Xint cursor(row, col)
Xint row, col;
X{
X	long xval, yval;
X
X	/* Check valid range for this screen type.			*/
X	if (col <= 0 || col > graphics.cellfont.chars_per_line) return(1);
X	if (row <= 0 || row > graphics.cellfont.lines_per_screen) return(1);
X
X	/* Move the graphics cursor.  Add a 1/2 pixel offset so we will	*/
X	/* always round down to the correct pixel value.		*/
X
X	xval = (col-1) * graphics.cellfont.xtic;	/* The value...	*/
X	xval += NORM_X_RANGE / graphics.x_extent / 2;	/* Plus 1/2 pix	*/
X
X	yval = (row-1) * graphics.cellfont.ytic;
X	yval += NORM_Y_RANGE / graphics.y_extent / 2;
X
X	if (movepen((int)xval, (int)yval)) return(1);
X
X	return(0);
X}
XxX--EOF--XxX
echo restoring draw.c
sed 's/^X//' > draw.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) draw.c 4.4 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/*  Sat Mar 21 22:59:10 EST 1987 */
X/*  dtl 2-8-87
X**
X**	Write a line on the CGA or Hercules adapter.
X**	This routine assumes that the current graphics cursor position is
X**	set, and draws a line to the indicated point.
X*/
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
X
Xdraw(new_x_cursor,new_y_cursor)  
X	int new_x_cursor, new_y_cursor;
X{
X
X        /* Draw line from current cursor to new position. */
X        /* Parameters are in normalized 2-D coordinates. */
X
X        int x_dist;     /* Pixel coordinates */
X        int y_dist;     /* Pixel coordinates */
X        int x_start;    /* Pixel coordinates */
X        int y_start;    /* Pixel coordinates */
X        int x_final; 	/* Pixel coordinates */
X        int y_final; 	/* Pixel coordinates */
X        int x_current;  /* Pixel coordinates */
X        int y_current;  /* Pixel coordinates */
X	int x_pixels;	/* X distance in pixels */
X	int y_pixels;	/* Y distance in pixels */
X        long int slope;
X        int offset;
X        long int idx;
X
X	int write_pix();
X
X	/* Check for out of range. */
X
X	if (new_x_cursor < 0 || new_y_cursor < 0) return(1);
X
X        /* Find the starting point in pixel coordinates. */
X  
X        x_current = x_start = conv_x_coord(graphics.x_cursor);
X        y_current = y_start = conv_y_coord(graphics.y_cursor);
X
X        /* Find the end point in pixel coordinates. */
X  
X        x_final = conv_x_coord(new_x_cursor);
X        y_final = conv_y_coord(new_y_cursor);
X
X	/* Find the distances in pixel coordinates. */
X
X        x_dist = x_final - x_start;
X        y_dist = y_final - y_start;
X
X	/* Find the number of pixels to travel in the x any y directions. */
X
X	x_pixels = abs(x_dist);
X	y_pixels = abs(y_dist);
X
X        /* Step across the screen pixel by pixel.  Do this in the x 	*/
X        /* direction if x_dist is greater than y_dist; else, do it in	*/
X        /* the y direction.						*/
X
X        if (x_pixels > y_pixels) {
X                /* Stepwise in x direction. */
X
X                /* Calculate the slope to use (rise over run). */
X                /* Shift left 16 bits for precision. */
X                if (x_dist != 0) slope = (long)y_dist * 0x010000L / 
X                (long)x_dist;
X                else slope = 0x7FFFFFFFL; /* Infinity */
X
X                /* Figure a fudge factor to be used in offsetting the */
X                /* pixels by 1/2 pixel. */
X                if (slope > 0) offset = 1;
X                else if (slope < 0) offset = -1;
X                else offset = 0;
X
X                /* Write the line on the screen. */
X
X                if (x_final - x_start >= 0)  {
X                        if (slope==0)  {
X                                while (x_current <= x_final)
X					if (write_pix(x_current++, 
X						y_current)) return(1);
X                        }
X                        else for (idx=0; idx <= x_pixels; idx++, x_current++)  {
X                                y_current = y_start + (idx*slope/0x08000L 
X                                + offset)/2;
X                                if (write_pix(x_current, y_current))
X					return(1);
X                        }
X                }
X                else  {
X                        if (slope==0)  {
X				while (x_current >= x_final)
X                                        if (write_pix(x_current--, 
X						y_current)) return(1);
X                        }
X                        else for (idx=0; idx <= x_pixels; idx++, x_current--)  {
X                                y_current = y_start - (idx*slope/0x08000L 
X                                + offset)/2;
X                                if (write_pix(x_current, y_current)) 
X					return(1);
X                        }
X                }
X        }
X        else  {
X                /* Stepwise in y direction. */
X
X                /* Calculate the inverse slope to use (run over rise). */
X                /* Shift left 16 bits for precision. */
X                if (y_dist != 0) slope = (long)x_dist * 0x010000L / 
X                (long)y_dist;
X                else slope = 0x7FFFFFFF; /* Infinity */
X
X                /* Figure a fudge factor to be used in offsetting the */
X                /* pixels by 1/2 pixel. */
X                if (slope > 0) offset = 1;
X                else if (slope < 0) offset = -1;
X                else offset = 0;
X
X               /* Write the line on the screen. */
X
X                if (y_final - y_start >= 0)  {
X                        if (slope==0)  {
X                                while (y_current <= y_final)
X                                        if (write_pix(x_current, 
X						y_current++)) return(1);
X                        }
X                        else for (idx=0; idx <= y_pixels; idx++, y_current++)  {
X                                x_current = x_start + (idx*slope/0x08000L 
X                                + offset)/2;
X                                if (write_pix(x_current, y_current))
X					return(1);
X                        }
X                }
X                else  {
X                        if (slope==0)  {
X				while (y_current >= y_final)
X                                        if (write_pix(x_current, 
X						y_current--)) return(1);
X                        }
X                        else for (idx=0; idx <= y_pixels; idx++, y_current--)  {
X                                x_current = x_start - (idx*slope/0x08000L 
X                                + offset)/2;
X                                if (write_pix(x_current, y_current))
X					return(1);
X                        }
X                }
X        }
X        /* Advance the cursor to the new position. */
X        graphics.x_cursor = new_x_cursor;
X        graphics.y_cursor = new_y_cursor;
X	return(0);
X}
XxX--EOF--XxX
echo restoring grafchar.c
sed 's/^X//' > grafchar.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) grafchar.c 4.4 88/06/20";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Write a graphics character to the screen.				*/
X/* Sat Dec 12 12:51:27 EST 1987						*/
X/* system5 dtlewis 2 2.2-U AT						*/
X
X#include "font.h"
X
Xint grafchar(asc_char,x,y,vsize,hsize)  
Xunsigned char asc_char;
Xint x, y, vsize, hsize;
X{
X	int x1, y1, x2, y2, i;
X	int linedraw();
X
X	union  
X		{
X		struct  
X			{
X			unsigned col2 : 4;
X			unsigned row2 : 4;
X			unsigned col1 : 4;
X			unsigned row1 : 4;
X			}  part;
X		struct
X			{
X			unsigned word;
X			}  whole;
X		}  font;
X
X	for (i=0; i<=35; i++)  {
X		if ((font.whole.word = stroke[asc_char][i]) != 0xFFFF) 
X			if (linedraw(
X				x1 = x+font.part.col1*hsize,
X				y1 = y+font.part.row1*vsize,
X				x2 = x+font.part.col2*hsize,
X				y2 = y+font.part.row2*vsize)
X				) return(1);
X	}
X	return(0);
X}
X
XxX--EOF--XxX
echo restoring grafstr.c
sed 's/^X//' > grafstr.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) grafstr.c 4.3 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Write string of a graphics characters to the screen.			*/
X/* Sat Dec 12 12:51:27 EST 1987						*/
X/* system5 dtlewis 2 2.2-U AT						*/
X
X#include <stdio.h>
X
Xint grafstr(strng,x,y,vsize,hsize,spacing)  
Xchar strng[];
Xint 	x,		/* X position of upper left corner of character cell */
X	y,		/* Y position of character cell			*/
X	vsize,		/* Vertical size of character cell		*/
X	hsize,		/* Horizontal size of character cell		*/	
X	spacing;	/* Distance between characters			*/
X{
X	int i;
X	int grafchar();
X	for(i=0; strng[i] != NULL; i++)  {
X		if (grafchar(strng[i],x,y,vsize,hsize)) return(1);
X		x += spacing;
X	}
X	return(0);
X}
X
XxX--EOF--XxX
echo restoring init.c
sed 's/^X//' > init.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) init.c 4.4 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Sat Nov 28 17:10:53 EST 1987 */
X/* Initialize shared memory for use in graphics I/O.  This routine is	*/
X/* specific to Microport System V/AT, and presumes that shared memory	*/
X/* segments have been defined (usually at system boot time) such that	*/
X/* the shared memory keys are "B8000L" for CGA adapter, and so on.	*/
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/ipc.h>
X#include <math.h>
X#include <malloc.h>
X#include "graphics.h"
X
Xstruct SVAT_graphics graphics;
X
Xint init(mode)
Xint mode;
X/* Mode is the video mode that will be used when in graphics mode.	*/
X/* By implication, this gives us the memory location we want to attach	*/
X/* to, as well as the dimensions of the screen.				*/
X
X{
X	char *shmat();
X	int shmid;
X	char *malloc();
X	int clear();
X	extern int errno;
X	static char initialized = 'N';	/* Flag to prevent reinitialization */
X
X	graphics.grafmode = mode;
X
X	/* Attach to the appropriate shared memory segment, and set the	*/
X	/* values of graphics.x_extent and graphics.y_extent, according	*/
X	/* to the video mode requested.					*/
X
X	switch (graphics.grafmode)  {
X	case CGA_COLOR_MODE:
X		graphics.x_extent = 319;
X		graphics.y_extent = 199;
X		graphics.x_window_ll = 0;
X		graphics.y_window_ll = 0;
X		graphics.x_window_ur = 319;
X		graphics.y_window_ur = 199;
X		graphics.aspect_ratio = 0.7;
X		graphics.cellfont.chars_per_line = 40;
X		graphics.cellfont.lines_per_screen = 25;
X		graphics.strokefont.xtic = 800;
X		graphics.strokefont.ytic = 1500;
X		graphics.strokefont.xsize = 100;
X		graphics.strokefont.ysize = 160;
X		if ((shmid = shmget(0xB8000L, 32768, IPC_CREAT)) < 0)
X			return(errno);
X		graphics.cgamem = (CGA_BUF_TYPE *)shmat(shmid, 0L, 0);
X		break;
X	case CGA_HI_RES_MODE:
X		graphics.x_extent = 639;
X		graphics.y_extent = 199;
X		graphics.x_window_ll = 0;
X		graphics.y_window_ll = 0;
X		graphics.x_window_ur = 639;
X		graphics.y_window_ur = 199;
X		graphics.aspect_ratio = 0.7;
X		graphics.cellfont.chars_per_line = 80;
X		graphics.cellfont.lines_per_screen = 25;
X		graphics.strokefont.xtic = 480;
X		graphics.strokefont.ytic = 1500;
X		graphics.strokefont.xsize = 60;
X		graphics.strokefont.ysize = 160;
X		if ((shmid = shmget(0xB8000L, 32768, IPC_CREAT)) < 0)
X			return(errno);
X		graphics.cgamem = (CGA_BUF_TYPE *)shmat(shmid, 0L, 0);
X		break;
X	case HERC_GRAF_MODE:
X		graphics.x_extent = 719;
X		graphics.y_extent = 347;
X		graphics.x_window_ll = 0;
X		graphics.y_window_ll = 0;
X		graphics.x_window_ur = 719;
X		graphics.y_window_ur = 347;
X		graphics.aspect_ratio = 0.7;
X		graphics.cellfont.chars_per_line = 90;
X		graphics.cellfont.lines_per_screen = 43;
X		graphics.strokefont.xtic = 400;
X		graphics.strokefont.ytic = 1500;
X		graphics.strokefont.xsize = 50;
X		graphics.strokefont.ysize = 160;
X		if ((shmid = shmget(0xB0000L, 32768, IPC_CREAT)) < 0)
X			return(errno);
X		graphics.hercmem = (HERC_BUF_TYPE *)shmat(shmid, 0L, 0);
X		break;
X	case EGA_COLOR_MODE:
X		/* (not implemented yet) */
X		graphics.x_extent = 639;
X		graphics.y_extent = 349;
X		graphics.x_window_ll = 0;
X		graphics.y_window_ll = 0;
X		graphics.x_window_ur = 639;
X		graphics.y_window_ur = 349;
X		graphics.aspect_ratio = 0.7;
X		graphics.cellfont.chars_per_line = 80;
X		graphics.cellfont.lines_per_screen = 43;
X		graphics.strokefont.xtic = 480;
X		graphics.strokefont.ytic = 1500;
X		graphics.strokefont.xsize = 60;
X		graphics.strokefont.ysize = 160;
X		if ((shmid = shmget(0xA0000L, 32768, IPC_CREAT)) < 0)
X			return(errno);
X		graphics.egamem = (EGA_BUF_TYPE *)shmat(shmid, 0L, 0);
X		break;
X	case IBM_PRINTER:
X		graphics.x_extent = 719;
X		graphics.y_extent = 959;
X		graphics.x_window_ll = 0;
X		graphics.y_window_ll = 0;
X		graphics.x_window_ur = 719;
X		graphics.y_window_ur = 959;
X		graphics.aspect_ratio = 0.7;
X		graphics.cellfont.chars_per_line = 90;
X		graphics.cellfont.lines_per_screen = 120;
X		graphics.strokefont.xtic = 400;
X		graphics.strokefont.ytic = 1000;
X		graphics.strokefont.xsize = 50;
X		graphics.strokefont.ysize = 100;
X		if ((graphics.printbuf1 = (PR_BUF_TYPE *)malloc
X			(sizeof(PR_BUF_TYPE))) == NULL) return(1);
X		if ((graphics.printbuf2 = (PR_BUF_TYPE *)malloc
X			(sizeof(PR_BUF_TYPE))) == NULL) return(1);
X		if ((graphics.printbuf3 = (PR_BUF_TYPE *)malloc
X			(sizeof(PR_BUF_TYPE))) == NULL) return(1);
X		break;
X
X	default:
X		/* The programmer is probably confused at this point,	*/
X		/* so we may as well exit.				*/
X		printf ("Unable to initialize in routine init().  Mode %d requested.\n",graphics.grafmode);
X		exit (1);
X	}
X
X	/* Set other variables to reasonable values.			*/
X
X	graphics.color = 2;
X	graphics.wrt_mode = OR;
X	graphics.xlate_x = 0;
X	graphics.xlate_y = 0;
X	graphics.xlate_z = 0;
X	graphics.offset_x = 0;
X	graphics.offset_y = 0;
X	graphics.offset_z = 0;
X	graphics.theta_x = 0;
X	graphics.theta_y = 0;
X	graphics.theta_z = 0;
X	graphics.c_tz_c_ty = 1.0;
X	graphics.s_tz = 0.0;
X	graphics.s_ty = 0.0;
X	graphics.c_tz_c_tx = 1.0;
X	graphics.s_tx = 0.0;
X	graphics.scale_factor = 1.0;
X	graphics.perspect_dist = HUGE;
X	graphics.x_vport_ll = NORM_X_MIN;
X	graphics.y_vport_ll = NORM_Y_MAX;
X	graphics.x_vport_ur = NORM_X_MIN;
X	graphics.y_vport_ur = NORM_Y_MAX;
X
X	graphics.strokefont.angle = 0;
X	graphics.strokefont.angle = 0;
X
X	/* Character cell spacing in normalized coordinates.  This is	*/
X	/* the distance in normalized coordinates.  The calculation	*/
X	/* must account for leftover scan lines on the bottom of the	*/
X	/* screen.							*/
X	graphics.cellfont.xtic = 
X		NORM_X_RANGE
X		* (graphics.x_extent 
X		- (graphics.x_extent + 1) % X_CELL_BITS)
X		/ graphics.x_extent
X		/ graphics.cellfont.chars_per_line;
X	/* The (integer) value just got rounded down, but we want to	*/
X	/* round up always, so that we won't lose a pixel.  Therefore	*/
X	/* increment the value by 1.					*/
X	graphics.cellfont.xtic++;
X
X	graphics.cellfont.ytic =
X		NORM_Y_RANGE 
X		* (graphics.y_extent 
X		- (graphics.y_extent + 1) % Y_CELL_BITS)
X		/ graphics.y_extent
X		/ graphics.cellfont.lines_per_screen;
X	graphics.cellfont.ytic++;
X
X	graphics.cellfont.xmult = 1;	/* Cell size multipliers	*/
X	graphics.cellfont.ymult = 1;
X
X	/* Erase graphics memory.					*/
X	if (clear()) return(1);
X
X	return(0);
X}
XxX--EOF--XxX
-- 
Dave Lewis
Ann Arbor, MI
...![ itivax umix ]!m-net!dtlewis!lewis

lewis@m2-net.UUCP (Dave Lewis) (07/01/88)

------------------------------  cut here  ------------------------------
# To recover, type "sh archive"
echo restoring Makefile
sed 's/^X//' > Makefile <<XxX--EOF--XxX
XCFLAGS = -c -Ml -O
XLDFLAGS = -Ml
XOBJS = testpat.o clear.o movpen.o draw.o box.o linedraw.o write_pix.o init.o grafchar.o grafstr.o finish.o cellchar.o cellstr.o cursor.o pix_mode.o pix_color.o
X
Xall:	demo xdemo mode 
X
Xmode: mode.c setmode.c 
X	cc -o mode mode.c setmode.c
X	chmod +x mode.sh
X	#
X	# If you have an EGA or CGA, you can use mode.sh instead of
X	# the mode.c program (mv mode.sh mode)."  If you have a Hercules
X	# or Everex Edge, use mode.c.  For other adapters, you may have
X	# to modify mode.c.
X	#
X	# If you use mode.c, you must make it suid and owned by root.
X	# Put it in a safe path, of course.
X	#
X	# Don't forget to create your video shared memory using 
X	# shmcreate(1).  This should be in your /etc/rc.d/shm.rc file.
X	#
X	# Try running demo and xdemo to see how things work.
X
Xdemo:	demo.o \$(OBJS)
X	cc demo.o -o demo \$(LDFLAGS) $(OBJS)
X
Xxdemo:	xdemo.o \$(OBJS)
X	cc xdemo.o -o xdemo \$(LDFLAGS) $(OBJS)
X
Xdemo.o: demo.c
X	cc \$(CFLAGS) demo.c
X
Xtestpat.o: testpat.c
X	cc \$(CFLAGS) testpat.c
X
Xclear.o: clear.c
X	cc \$(CFLAGS) clear.c
X
Xmovpen.o: movpen.c
X	cc \$(CFLAGS) movpen.c
X
Xdraw.o: draw.c
X	cc \$(CFLAGS) draw.c
X
Xbox.o: box.c
X	cc \$(CFLAGS) box.c
X
Xlinedraw.o: linedraw.c
X	cc \$(CFLAGS) linedraw.c
X
Xwrite_pix.o: write_pix.c
X	cc \$(CFLAGS) write_pix.c
X
Xinit.o: init.c
X	cc \$(CFLAGS) init.c
X
Xgrafchar.o: grafchar.c
X	cc \$(CFLAGS) grafchar.c
X
Xgrafstr.o: grafstr.c
X	cc \$(CFLAGS) grafstr.c
X
Xfinish.o: finish.c
X	cc \$(CFLAGS) finish.c
X
Xcellchar.o: cellchar.c
X	cc \$(CFLAGS) cellchar.c
X
Xcellstr.o: cellstr.c
X	cc \$(CFLAGS) cellstr.c
X
Xcursor.o: cursor.c
X	cc \$(CFLAGS) cursor.c
X
Xpix_mode.o: pix_mode.c
X	cc \$(CFLAGS) pix_mode.c
X
Xpix_color.o: pix_color.c
X	cc \$(CFLAGS) pix_color.c
X
X
XxX--EOF--XxX
echo restoring demo.c
sed 's/^X//' > demo.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) demo.c 4.6 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X#include <signal.h>
X#include <sys/types.h>
X#include <ctype.h>
X#include <sys/ipc.h>
X#include <stdio.h>
X
X/*  Sun Nov 29 16:20:03 EST 1987 */
X/*  Sat Mar 21 22:59:10 EST 1987 */
X/*  Sun Feb 21 11:50:45 EST 1988 */
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
X
Xmain(argc,argv)  
Xint argc;
Xchar *argv[];
X{
X	int testpattern();
X
X	char *mode_to_use[8];
X	int idx;
X	int init(), grafstr(), finish(), istat;
X	void null_function(); 
X
X	if (argc < 2)  {
X		printf ("Usage:  demo <mode>\n\nWhere <mode> can be 4, 6, 8, EGA or print)\n");
X		exit(0);
X		}
X
X	if (strcmp(argv[1],"4") == 0) {
X		graphics.grafmode = CGA_COLOR_MODE;
X		strcpy(mode_to_use,"mode 4");
X	}
X	else if (strcmp(argv[1],"6") == 0) {
X		graphics.grafmode = CGA_HI_RES_MODE;
X		strcpy(mode_to_use,"mode 6");
X	}
X	else if (strcmp(argv[1],"8") == 0) {
X		graphics.grafmode = HERC_GRAF_MODE;
X		strcpy(mode_to_use,"mode 8");
X	}
X	else if (strcmp(argv[1],"16") == 0) {
X		graphics.grafmode = EGA_COLOR_MODE;
X		strcpy(mode_to_use,"mode 16");
X	}
X	else if (strcmp(argv[1],"EGA") == 0) { 
X		graphics.grafmode = EGA_COLOR_MODE;
X		strcpy(mode_to_use,"mode 16");
X	}
X	else if (strcmp(argv[1],"print") == 0) { 
X		graphics.grafmode = IBM_PRINTER;
X		strcpy(mode_to_use," ");
X	}
X	else  {
X		printf ("Valid modes are 4, 6, 8, EGA, and print.\n");
X		exit (1);
X	}
X
X        /* Set video mode. */
X
X	istat = init(graphics.grafmode);
X
X	system(mode_to_use);
X
X	istat = clear();
X
X	istat = testpattern();
X
X	if (graphics.grafmode != IBM_PRINTER)  {
X
X		/* Kill some time... */
X		signal(SIGALRM,null_function);
X		alarm(4);
X		pause();
X
X		istat = clear();
X
X		/* void grafstr(strng,x,y,vsize,hsize,spacing)  */
X		istat = grafstr("AbCdEfGhIjKlMnOpQrStUvWxYz",10,10000,400,180,1250);
X		istat = grafstr("AbCdEfGhIjKlMnOpQrStUvWxYz",100,25000,150,80,667);
X		istat = grafstr("AbCdEfGhIjKlMnO",100,15000,800,360,2500);
X
X		istat = grafstr("Z#\$%^&*()+",100,20000,600,400,2600);
X
X	if (graphics.grafmode != IBM_PRINTER)  {
X		/* Kill some time... */
X		signal(SIGALRM,null_function);
X		alarm(4);
X		pause();
X	}
X
X		istat = clear();
X
X		istat = cursor(1,1);
X		istat = cellstr("This should be (1,1)");
X
X		istat = cursor(2,30);
X		istat = cellstr("This should be (2,30)");
X
X		istat = cursor(3,60);
X		istat = cellstr("This should be (3,60)");
X
X		istat = cursor(10,40);
X		istat = cellstr("This should be (10,40)");
X
X		istat = cursor(25,40);
X		cellstr("X");
X
X		istat = cursor(25,80);
X		cellstr("X");
X
X		istat = cursor(43,90);
X		cellstr("X");
X
X		cursor(2,1); cellstr("This");
X		cursor(3,1); cellstr(" Is ");
X		cursor(4,1); cellstr("  A ");
X		cursor(5,1); cellstr("TEST");
X		cursor(6,1); cellstr("XXXX");
X		cursor(7,1); cellstr("XXXX");
X
X		for (idx=1;idx<=43;idx++)  {
X			cursor(idx,20);
X			cellstr("XHIHX");
X		}
X
X		/* Kill some time... */
X		signal(SIGALRM,null_function);
X		alarm(4);
X		pause();
X
X		system ("mode 2");
X	}
X
X	istat = finish();
X}
X
Xstatic void null_function()  {
X	/* Do nothing.  Dummy signal handling routine for SIGALRM. */
X}
X
XxX--EOF--XxX
echo restoring finish.c
sed 's/^X//' > finish.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) finish.c 4.6 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X
X/* Wed Feb 10 20:58:37 EST 1988						*/
X/* Detach shared memory and do any other clean up chores.		*/
X/* If printing, the print job is dispatched to the print spooler.	*/
X/* This routine is specific to Microport System V/AT, and presumes 	*/
X/* that shared memory segments have been defined (usually at system 	*/
X/* boot time) such that	the shared memory keys are "B8000L" for CGA 	*/
X/* adapter, and so on. */
X
X#define TEXTPITCH(fp) fputc(033,fp);fputc('A',fp);fputc(014,fp);fputc(033,fp);fputc('2',fp);
X#define GRAFPITCH(fp) fputc(033,fp); fputc('1',fp);
X#define GRAFSTART(fp) fputc(033,fp); fputc('L',fp); fputc(0300,fp);fputc(03,fp);
X#define CRLF(fp) fputc(015,fp); fputc(012,fp);
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/ipc.h>
X#include <string.h>
X#include "graphics.h"
X
Xint finish()
X
X{
X	extern struct SVAT_graphics graphics;
X	int shmdt(), fprintf(), fputs(), fwrite();
X	int shmid;
X	int clear();
X	void free();
X	char *getenv();
X	extern errno;
X	int idx;
X	char printprog[60];
X	char *envptr;
X
X	FILE *popen(), *fhandle;
X	int pclose();
X
X	switch (graphics.grafmode)  {
X
X		case CGA_HI_RES_MODE:
X			/* Erase graphics memory.		*/
X			if (clear()) return(1);
X			/* Detach the shared memory segment.	*/
X			if (shmdt(graphics.cgamem) < 0) return(errno);
X			break;
X
X		case CGA_COLOR_MODE:
X			/* Erase graphics memory.		*/
X			if (clear()) return(1);
X			/* Detach the shared memory segment.	*/
X			if (shmdt(graphics.cgamem) < 0) return(errno);
X			break;
X
X		case EGA_COLOR_MODE:
X			/* Erase graphics memory.		*/
X			if (clear()) return(1);
X			/* Detach the shared memory segment.	*/
X			if (shmdt(graphics.egamem) < 0) return(errno);
X			break;
X
X		case HERC_GRAF_MODE:
X			/* Erase graphics memory.		*/
X			if (clear()) return(1);
X			/* Detach the shared memory segment.	*/
X			if (shmdt(graphics.hercmem) < 0) return(errno);
X			break;
X
X		case IBM_PRINTER:
X	
X			/* Print the buffer */
X
X			/* Use the environment variable PLOTDEV if set. */
X
X			strcpy(printprog, PRINTPROG);
X			strcat(printprog, " ");
X			if ((envptr = getenv("PLOTDEV")) != NULL)  {
X				strcat(printprog, "-d");
X				strcat(printprog, envptr);
X			}
X	
X			if ((fhandle = popen(printprog, "w")) == NULL) {
X				fprintf(stderr,
X					"finish():  Error piping to %s\n", 
X					printprog);
X				return(1); 
X				}
X
X			/* Dump the print image to the file */
X
X			/* Set line feed pitch to 7/72" */
X
X			GRAFPITCH(fhandle);
X
X			/* Write the lines of data (3 buffers full) */
X			for (idx=0; idx<PRINTLINES; idx++)  {
X				GRAFSTART(fhandle);
X				fwrite(&(graphics.printbuf1->buf[idx][0]),
X					sizeof(char), PRINTDENSITY, fhandle);
X				CRLF(fhandle);
X			}
X			for (idx=0; idx<PRINTLINES; idx++)  {
X				GRAFSTART(fhandle);
X				fwrite(&(graphics.printbuf2->buf[idx][0]),
X					sizeof(char), PRINTDENSITY, fhandle);
X				CRLF(fhandle);
X			}
X			for (idx=0; idx<PRINTLINES; idx++)  {
X				GRAFSTART(fhandle);
X				fwrite(&(graphics.printbuf3->buf[idx][0]),
X					sizeof(char), PRINTDENSITY, fhandle);
X				CRLF(fhandle);
X			}
X
X			/* Set line feed pitch back to 12/72" for text */
X			TEXTPITCH(fhandle);
X
X			if (pclose(fhandle) < 0) return(1);
X
X			/* Free the allocated memory. */
X			free(graphics.printbuf1);
X			free(graphics.printbuf2);
X			free(graphics.printbuf3);
X
X			break;
X
X		default:
X			return(1);
X	}
X	return(0);
X}
X
X
XxX--EOF--XxX
echo restoring linedraw.c
sed 's/^X//' > linedraw.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) linedraw.c 4.4 88/06/20";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Fri Jul  3 23:43:36 EDT 1987
X** dtlewis
X** Routine to draw a line.
X*/
X
Xint linedraw(x1,y1,x2,y2)  
X	int x1, y1, x2, y2;
X{
X	int movepen(), draw();
X	if (movepen(x1,y1)) return(1);
X	if (draw(x2,y2)) return(1);
X	return(0);
X}
XxX--EOF--XxX
echo restoring mode.c
sed 's/^X//' > mode.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) mode.c 4.4 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* dtlewis 7-13-1987 
X** Take command line argument to set graphics mode.  If no argument, then
X** read standard input until end of file.
X*/
X
X#define NORMAL_MODE 2
X
X#include <stdio.h>
X
Xmain(argc,argv) 
Xint argc;
Xchar *argv[];
X{
X	int setmode();
X	int modevalue, stat;
X	char *inbuf[20];
X
X	if (argc > 2) {
X		printf("Usage:  mode n\n");
X		exit(0);
X	}
X
X	else if (argc == 2)  {
X		modevalue = atoi(argv[1]);
X		if (modevalue < 0 || modevalue > 11) {
X			printf("Mode must be between 0 and 11\n");
X			exit(0);
X		}
X		setmode(modevalue);
X	}
X	else if (argc == 1)  {
X#ifdef DEBUG
X		for ( ; ; ) {
X			stat=scanf("%d", &modevalue);
X			if (stat == EOF) exit(0);
X			/* Clear input stream if bad read. */
X			if (stat == 0) gets(inbuf, 20, stdin); 
X			if (stat == 1 && modevalue >= 0 && modevalue <=11) 
X				setmode(modevalue);
X			}
X#endif /* DEBUG */
X		setmode(NORMAL_MODE);
X		}
X	}
XxX--EOF--XxX
echo restoring mode.sh
sed 's/^X//' > mode.sh <<XxX--EOF--XxX
X:
X#  Contributed by Denis Fortin, April 1988.
X#
X#  mode - This trivial little command file is used to set the graphics mode
X#	  of the console on Microport System V/AT.
X#
X#  Usage:
X#		mode [value]
X#
X# 	where: value is an integer used to select the current display
X#		     mode.  If it is omitted, the screen is returned to
X#		     normal text mode.
X#
X#  Examples:
X#	mode
X#		Returns to normal text mode
X#
X#	mode 16
X#		Puts an EGA card with Enhanced Display adapter in 640x350
X#		graphics mode.
X#
X#	mode 6
X#		Puts a CGA card in 640x200 graphics mode.
X#
Xif [ \$# -lt 1 ] 
Xthen
X	echo "\033[=h\c"
Xelse
X	echo "\033[=\${1}h\c"
Xfi
XxX--EOF--XxX
echo restoring movpen.c
sed 's/^X//' > movpen.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) movpen.c 4.3 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* dtlewis Fri Jul  3 23:12:40 EDT 1987 
X** Routine to move the logical graphics cursor to the indicated (x,y)
X** position.
X*/
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
X
Xint movepen(x,y)  
X	int x,y;
X{
X        /* Set the graphics cursor to the indicated position. */
X        /* X and y are in normalized 2-D coordinates (0 to 32767). */
X        if ((graphics.x_cursor = x) < 0 ) return(1);
X        if ((graphics.y_cursor = y) < 0 ) return(1);
X	return(0);
X}
XxX--EOF--XxX
echo restoring setmode.c
sed 's/^X//' > setmode.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) setmode.c 4.3 88/06/19";
X#endif
X#define MSDOS 0
X#define UNIX 1
X/*
X *	Module	:	mode
X *	Date	:	8705.20
X *	Author	:	Jeffrey A. Turner
X *	Purpose	:	Set cga video modes (0-6) when active Unix display
X *			is an mda.  Modified to support modes 7 and 8
X *			on Everex Edge.
X *
X *	Modifications:	dtlewis 8-16-1987 Changes to support mode 7 and to
X *			support Hercules operation on an Everex Edge.
X *			Hercules 720 x 348 (page 0) is referred to as
X *			mode 8 for this routine, and Hercules page 1 is
X *			referred to as mode 9.  Note that these are for
X *			convenience, and conflict with the PCjr mode
X *			assignments, which I presume to be non-reusable
X *			and obsolete.
X *
X *			Split modeset() off from the main routine to make
X *			it callable from any program.
X *
X *			Renamed the function to setmode().
X *
X *	Useage:		int setmode(modenumber)
X *			int modenumber
X *
X *	\$Log$
X */
X
X#include <stdio.h>
X#if UNIX
X#include <sys/types.h>
X#include <sys/io_op.h>
X#endif
X
Xextern	errno;
X
Xint	fd;
X
X/* Define the mode register settings. */
Xunsigned char	creg[12] = {
X	0x2c, 0x28, 0x2d, 0x2d, 0x2a, 0x2e, 0x1e, 0x2d, 0x0e, 0x8e, 0x2d, 0x2d
X};
X/* Define the Everex extended graphics register settings */
Xunsigned char	ext_graf_reg[12] = {
X	0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x06, 0x06
X};
X
Xunsigned char	params[192] = {
X/*0*/	0x38, 0x28, 0x2d, 0x0a, 0x1f, 0x06, 0x19, 0x1c,   /* 40x25 b/w */
X	0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*1*/	0x38, 0x28, 0x2d, 0x0a, 0x1f, 0x06, 0x19, 0x1c,   /* 40x25 color */
X	0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*2*/	0x61, 0x50, 0x52, 0x0f, 0x19, 0x06, 0x19, 0x19,	  /* 80x25 b/w */
X	0x02, 0x0d, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
X
X/*3*/	0x71, 0x50, 0x5a, 0x0a, 0x1f, 0x06, 0x19, 0x1c,	  /* 80x25 color */
X	0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*4*/	0x38, 0x28, 0x2d, 0x0a, 0x7f, 0x06, 0x64, 0x70,	  /* 320x200 color */
X	0x02, 0x01, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*5*/	0x38, 0x28, 0x2d, 0x0a, 0x7f, 0x06, 0x64, 0x70,	  /* 320x200 b/w */
X	0x02, 0x01, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*6*/	0x38, 0x28, 0x2d, 0x0a, 0x7f, 0x06, 0x64, 0x70,	  /* 640x200 b/w */
X	0x02, 0x01, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*7*/	0x61, 0x50, 0x52, 0x0f, 0x19, 0x06, 0x19, 0x19,	  /* mono */
X	0x02, 0x0d, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00,
X
X/*8*/	0x36, 0x2d, 0x2e, 0x07, 0x5a, 0x02, 0x57, 0x57,   /* Hercules 720x348 */
X	0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X
X/*9*/	0x37, 0x2d, 0x2f, 0x05, 0x57, 0x00, 0x57, 0x57,   /* Hercules 720x348 */
X	0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X
X/*10*/	0x9a, 0x84, 0x86, 0x0f, 0x19, 0x06, 0x19, 0x19,   /* Everex 132x25b&w */
X	0x02, 0x0d, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00,
X
X/*11*/	0x9a, 0x84, 0x86, 0x0f, 0x2d, 0x02, 0x2c, 0x2c,   /* Everex 132x44b&w */
X	0x02, 0x07, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00
X};
X
Xsetmode(mode)
Xint	mode;
X{
X	int	i;
X	int	j;
X	int	bport;
X	int	cgaaddr  = 0x3d4;		/* cga 6845 port address */
X	int	monoaddr = 0x3b4;		/* mda 6845 port address */
X
X#if UNIX
X	if ((fd = open("/dev/mem", 2)) < 0) {
X		fprintf(stderr, "mode: open of /dev/mem failed\n");
X		perror("mode");
X		exit(1);
X		}
X#endif
X	if ((mode == 2 | mode == 7) | (mode == 8) | (mode == 9) |
X			(mode == 10) | (mode == 11))  {
X		/* Select mono mode on Everex Edge. */
X		bport = cgaaddr;
X		outb(bport+9, 2);		/* Extended Graphics Register */
X		bport = monoaddr;
X		}
X	else  {
X		/* Select CGA mode on Everex Edge. */
X		bport = monoaddr;
X		outb(bport+9, 0);		/* Extended Graphics Register */
X		bport = cgaaddr;
X		}
X
X	outb(bport+4, 0);			/* Reset mode register */
X
X	outb(bport+11, 0x06);			/* Enable all 64k of Everex 
X						** Edge video memory, for mono 
X						** adapter. 
X						*/
X
X	outb(bport+9, ext_graf_reg[mode]);	/* set Everex "extended 
X						graphics register" */
X	j = (mode+1)*16;
X	for(i=mode*16; i < j; i++) {
X		outb(bport, i);			/* select register */
X		outb(bport+1, params[i]);	/* send value */
X		}
X
X	outb(bport+4, creg[mode]);		/* enable */
X	if (mode == 6)
X		outb(bport+5, 0x3f);	/* set overscan for 640x200 */
X	else
X		outb(bport+5, 0x30);	/* set normal overscan */
X	close(fd);
X	return(0);
X}
X
X#if UNIX
Xoutb(portno, data)
Xint	portno;
Xint	data;
X{
X	io_op_t	iop;
X
X	iop.io_port = portno;
X	iop.io_byte = data;
X	if (ioctl(fd, IOCIOP_WB, &iop) < 0) {
X		fprintf(stderr, "mode: error on IOCIOP_WB\n");
X		perror("mode");
X		exit(1);
X	}
X}
X#endif
X
X
X#if MSDOS
Xoutb(portno, data)
Xint portno;
Xint data;
X{
X	outp(portno,data);
X}
X#endif
X
XxX--EOF--XxX
echo restoring testpat.c
sed 's/^X//' > testpat.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) testpat.c 4.5 88/06/20";
X#endif
X#include "graphics.h"
Xextern struct SVAT_graphics graphics;
X
Xint testpattern()  {
X
X	int pix_color();
X
X        /* Put a test pattern on the screen. */
X
X	int linedraw(), movepen(), draw(), box();
X
X	if (linedraw(4000,4000,20000,20000)) return(1);
X
X        if (movepen(6000,6000)) return(1);
X        if (draw(12000,6000)) return(1);
X        if (draw(12000,12000)) return(1);
X        if (draw(6000,12000)) return(1);
X        if (draw(6000,6000)) return(1);
X
X        if (movepen(6000,6000)) return(1);
X        if (draw(12000,12000)) return(1);
X
X	pix_color(3);
X
X	if (box(700,700,900,1200)) return(1);
X	if (box(900,1200,1100,1700)) return(1);
X	if (box(20000,20000,30000,30000)) return(1);
X
X	if (box(1000,10000,12000,12000)) return(1);
X	if (box(9000,9000,13000,13000)) return(1);
X	if (box(8000,8000,14000,14000)) return(1);
X	if (box(7000,7000,15000,15000)) return(1);
X	if (box(6000,6000,16000,16000)) return(1);
X
X        if (movepen(2000,13000)) return(1);
X        if (draw(4000,13000)) return(1);
X        if (movepen(4000,13300)) return(1);
X        if (draw(2000,13300)) return(1);
X
X	pix_color(2);
X
X        if (movepen(2000,14000)) return(1);
X        if (draw(30000,14400)) return(1);
X        if (draw(2000,14800)) return(1);
X        if (draw(30000,15200)) return(1);
X        if (draw(2000,15600)) return(1);
X        if (draw(30000,16000)) return(1);
X        if (draw(2000,16400)) return(1);
X        if (draw(30000,16800)) return(1);
X        if (draw(2000,17200)) return(1);
X        if (draw(30000,17600)) return(1);
X        if (draw(2000,18000)) return(1);
X        if (draw(30000,18400)) return(1);
X        if (draw(0,18800)) return(1);
X        if (draw(32000,19200)) return(1);
X        if (draw(0,19600)) return(1);
X        if (draw(32000,20000)) return(1);
X        if (draw(0,20400)) return(1);
X        if (draw(32000,20800)) return(1);
X        if (draw(0,21200)) return(1);
X        if (draw(32000,21600)) return(1);
X        if (draw(0,22000)) return(1);
X        if (draw(32000,22400)) return(1);
X
X        if (movepen(6000,4000)) return(1);
X        if (draw(6200,30000)) return(1);
X        if (draw(6400,4000)) return(1);
X        if (draw(6600,30000)) return(1);
X        if (draw(6800,4000)) return(1);
X        if (draw(7000,30000)) return(1);
X        if (draw(7200,4000)) return(1);
X        if (draw(7400,30000)) return(1);
X        if (draw(7600,4000)) return(1);
X        if (draw(7800,30000)) return(1);
X        if (draw(8000,4000)) return(1);
X        if (draw(8200,30000)) return(1);
X        if (draw(8400,4000)) return(1);
X
X	pix_color(1);
X
X        if (movepen(2000,2000)) return(1);
X        if (draw(32000,4000)) return(1);
X        if (draw(31000,32000)) return(1);
X        if (draw(1000,30000)) return(1);
X        if (draw(2000,2000)) return(1);
X        if (draw(31000,32000)) return(1);
X
X        if (movepen(0,0)) return(1);
X        if (draw(32767,0)) return(1);
X        if (draw(32767,32767)) return(1);
X        if (draw(0,32767)) return(1);
X        if (draw(0,0)) return(1);
X        if (draw(32767,32767)) return(1);
X        if (movepen(0,32767)) return(1);
X        if (draw(32767,0)) return(1);
X
X	return(0);
X}
XxX--EOF--XxX
echo restoring write_pix.c
sed 's/^X//' > write_pix.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) write_pix.c 4.9 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X#include "graphics.h"
X/*
X *	The following routine writes a pixel dot on a CGA in modes 4
X *	and 6 and on Hercules for Microport System V/AT.
X *	Also writes to pixel buffer for printer support.
X *	Note: Operation of the "color" variable is untested; I have
X *	an Everex Edge with mono display.  Probably will work, though.
X *	I have used this in a program which does line drawing graphics,
X *	and it runs much faster than the equivalent MS-DOS program
X *	calling BIOS.  (Tested under MS-DOS with Mix-C compiler).
X */
X
Xint write_pix(x,y)  
X	int x, y;
X{
X
X/*	Mon Mar 23 00:14:50 EST 1987
X *	Sun Mar 13 22:21:46 EST 1988
X *	system5 dtlewis 2 1.3 AT
X *
X *	Compile with large memory model.
X *
X *	This routine currently supports modes 4, 6, and Hercules (arbitrarily
X *	defined as mode 8), as well as buffer for printer graphics.
X */
X
Xextern struct SVAT_graphics graphics;
X
Xstatic int row, col, page;
Xunsigned register char bitmask;
Xregister char shiftcount;
X
Xswitch (graphics.grafmode) {
X
X	case CGA_COLOR_MODE:
X
X		row = y >> 1;
X		col = x >> 2;
X
X		/* Select a color mask, consisting of four 2 bit patterns. */
X		switch (graphics.color) {
X			case 0:	bitmask = 0;
X				break;
X			case 1: bitmask = 0x055;
X				break;
X			case 2: bitmask = 0x0AA;
X				break;
X			case 3:	bitmask = 0x0FF;
X				break;
X			default:bitmask = 0x0FF;
X		}
X
X		/* Apply the color mask to the two bit pixel of interest. */
X		switch (x & 0x0003)  {
X			case 0:	bitmask &= PIX0;
X				break;
X			case 1:	bitmask &= PIX1;
X				break;
X			case 2:	bitmask &= PIX2;
X				break;
X			case 3:	bitmask &= PIX3;
X				break;
X		}
X
X		/* Write pixel to the appropriate page for this line. */
X		if (y & 0x0001) 
X			switch (graphics.wrt_mode)  {
X				case OR:
X					(graphics.cgamem)->page2[row][col] 
X						|= bitmask;
X					break;
X				case XOR:
X					(graphics.cgamem)->page2[row][col] 
X						^= bitmask;
X					break;
X			}
X		else
X			switch (graphics.wrt_mode)  {
X				case OR:
X					(graphics.cgamem)->page1[row][col] 
X						|= bitmask;
X					break;
X				case XOR:
X					(graphics.cgamem)->page1[row][col] 
X						^= bitmask;
X					break;
X			}
X		break;
X
X	case CGA_HI_RES_MODE:
X
X		row = y >> 1;
X		col = x >> 3;
X
X		bitmask = 0x80;
X		shiftcount = x & 0x0007;
X		bitmask = bitmask >> shiftcount;
X
X		if (y & 0x0001) {
X			switch (graphics.wrt_mode)  {
X				case OR:
X					(graphics.cgamem)->page2[row][col] 
X						|= bitmask;
X					break;
X				case XOR:
X					(graphics.cgamem)->page2[row][col] 
X						^= bitmask;
X					break;
X			}
X		}
X		else {
X			switch (graphics.wrt_mode)  {
X				case OR:
X					(graphics.cgamem)->page1[row][col] 
X						|= bitmask;
X					break;
X				case XOR:
X					(graphics.cgamem)->page1[row][col] 
X						^= bitmask;
X					break;
X			}
X		}
X		break;
X
X	case EGA_COLOR_MODE:
X
X		col = x >> 3;
X
X		bitmask = 0x80;
X		shiftcount = x & 0x0007;
X		bitmask = bitmask >> shiftcount;
X
X		(graphics.egamem)->mem[y][col] |= bitmask;
X		break;
X
X	case HERC_GRAF_MODE:
X
X		row = y >> 2;
X		col = x >> 3;
X
X		bitmask = 0x80 >> (x & 0x0007);
X
X		switch (y & 0x0003) {
X
X			case 0:
X				switch (graphics.wrt_mode)  {
X					case OR:
X						(graphics.hercmem)
X						->page1[row][col] 
X						|= bitmask;
X						break;
X					case XOR:
X						(graphics.hercmem)
X						->page1[row][col] 
X						^= bitmask;
X						break;
X				}
X				break;
X			case 1:
X				switch (graphics.wrt_mode)  {
X					case OR:
X						(graphics.hercmem)
X						->page2[row][col] 
X						|= bitmask;
X						break;
X					case XOR:
X						(graphics.hercmem)
X						->page2[row][col] 
X						^= bitmask;
X						break;
X				}
X				break;
X			case 2:
X				switch (graphics.wrt_mode)  {
X					case OR:
X						(graphics.hercmem)
X						->page3[row][col] 
X						|= bitmask;
X						break;
X					case XOR:
X						(graphics.hercmem)
X						->page3[row][col] 
X						^= bitmask;
X						break;
X				}
X				break;
X			case 3:
X				switch (graphics.wrt_mode)  {
X					case OR:
X						(graphics.hercmem)
X						->page4[row][col] 
X						|= bitmask;
X						break;
X					case XOR:
X						(graphics.hercmem)
X						->page4[row][col] 
X						^= bitmask;
X						break;
X				}
X				break;
X		}
X		break;
X
X	case IBM_PRINTER:
X
X		col = PRINTDENSITY - y - 1;
X
X		row = (x >> 3);
X		page = 0;
X		while (row >= PRINTLINES)  {
X			row -= PRINTLINES;
X			++page;
X		}
X
X		bitmask = 0x80 >> (x & 0x0007);
X
X		switch (page) {
X
X			case 0:	/* Page 0 */
X				switch (graphics.wrt_mode)  {
X					case OR:
X						(graphics.printbuf1)
X						->buf[row][col] 
X						|= bitmask;
X						break;
X					case XOR:
X						(graphics.printbuf1)
X						->buf[row][col] 
X						^= bitmask;
X						break;
X					}
X				break;
X			case 1:	/* Page 1 */
X				switch (graphics.wrt_mode)  {
X					case OR:
X						(graphics.printbuf2)
X						->buf[row][col] 
X						|= bitmask;
X						break;
X					case XOR:
X						(graphics.printbuf2)
X						->buf[row][col] 
X						^= bitmask;
X						break;
X					}
X				break;
X			case 2: /* Page 2 */
X				switch (graphics.wrt_mode)  {
X					case OR:
X						(graphics.printbuf3)
X						->buf[row][col] 
X						|= bitmask;
X						break;
X					case XOR:
X						(graphics.printbuf3)
X						->buf[row][col] 
X						^= bitmask;
X						break;
X					}
X				break;
X		}
X		break;
X	default:
X		return(1);
X	}
X	return(0);
X}
XxX--EOF--XxX
-- 
Dave Lewis
Ann Arbor, MI
...![ itivax umix ]!m-net!dtlewis!lewis

lewis@m2-net.UUCP (Dave Lewis) (07/01/88)

------------------------------  cut here  ------------------------------
# To recover, type "sh archive"
echo restoring bitmaps.h
sed 's/^X//' > bitmaps.h <<XxX--EOF--XxX
X/*	@(#) bitmaps.h 4.4 88/06/19	*/
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/* Number of print pixel columns across the page. */
X# define PRINTDENSITY 960
X/* Number of 8 pixel print rows down the page (times 3 for full page). */
X# define PRINTLINES 30
X
X/*
X *	Define the structure for CGA video memory.
X */
Xtypedef struct CGAMEM {
X	char page1[100][80];
X	char filler[192];
X	char page2[100][80];
X} CGA_BUF_TYPE;
X
X/*
X *	Define the structure for EGA video memory.
X */
Xtypedef struct EGAMEM {
X	char mem[350][80];
X} EGA_BUF_TYPE;
X
X/*
X *	Define the structure for Hercules video memory.
X */
Xtypedef struct HERCMEM {
X	char page1[87][90];
X	char filler1[362];
X	char page2[87][90];
X	char filler2[362];
X	char page3[87][90];
X	char filler3[362];
X	char page4[87][90];
X} HERC_BUF_TYPE;
X
X/*
X *	Define the structure for a memory buffer for IBM printer bit map
X *	image.  The horizontal resolution may be either 960 bits, or 480
X *	bits (in which case only part of the 960 characters is used in each
X *	line of the buffer).  The buffer is divided into multiple pages so 
X *	that it can fit into two memory segments of < 64K each.  That is, 
X *	three of these structures must be declared to make a complete print
X *	buffer for 90 * 960 byte printing.
X */
Xtypedef struct IBM_PRINT_BUF {
X		char buf[PRINTLINES][PRINTDENSITY];
X} PR_BUF_TYPE;	/* Three of these required! */
XxX--EOF--XxX
echo restoring cellfont.h
sed 's/^X//' > cellfont.h <<XxX--EOF--XxX
X/*	@(#) cellfont.h 4.3 88/06/19	*/
X/* Note: Copyright status unknown.  Presumed public domain.  dtl 3-15-88*/
X
X/* RAM-Loadable Character Sets for the IBM PC
X Richard Wilton
X July 1986 */
X
X/* definitions for 8 by 8 characters 00 through FF */
X
Xstatic char charcell [2048]={
X	0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,	/* 000 */
X	0x07E,0x081,0x0A5,0x081,0x0BD,0x099,0x081,0x07E,	/* 001 */
X	0x07E,0x0FF,0x000,0x0FF,0x0C3,0x0E7,0x0FF,0x07E,	/* 002 */
X	0x06C,0x0FE,0x0FE,0x0FE,0x07C,0x038,0x010,0x000,	/* 003 */
X	0x010,0x038,0x07C,0x0FE,0x07C,0x038,0x010,0x000,	/* 004 */
X	0x038,0x07C,0x038,0x0FE,0x0FE,0x07C,0x038,0x07C,	/* 005 */
X	0x010,0x010,0x038,0x07C,0x0FE,0x07C,0x038,0x07C,	/* 006 */
X	0x000,0x000,0x018,0x03C,0x03C,0x018,0x000,0x000,	/* 007 */
X	0x0FF,0x0FF,0x0E7,0x0C3,0x0C3,0x0E7,0x0FF,0x0FF,	/* 008 */
X	0x000,0x03C,0x066,0x042,0x042,0x066,0x03C,0x000,	/* 009 */
X	0x0FF,0x0C3,0x099,0x0BD,0x0BD,0x099,0x0C3,0x0FF,	/* 00A */
X	0x00F,0x007,0x00F,0x07D,0x0CC,0x0CC,0x0CC,0x078,	/* 00B */
X	0x03C,0x066,0x066,0x066,0x03C,0x018,0x07E,0x018,	/* 00C */
X	0x03F,0x033,0x03F,0x030,0x030,0x070,0x0F0,0x0E0,	/* 00D */
X	0x07F,0x063,0x07F,0x063,0x063,0x067,0x0E6,0x0C0,	/* 00E */
X	0x099,0x05A,0x03C,0x0E7,0x0E7,0x03C,0x05A,0x099,	/* 00F */
X	0x080,0x0E0,0x0F8,0x0FE,0x0F8,0x0E0,0x080,0x000,	/* 010 */
X	0x002,0x00E,0x03E,0x0FE,0x03E,0x00E,0x002,0x000,	/* 011 */
X	0x018,0x03C,0x07E,0x018,0x018,0x07E,0x03C,0x018,	/* 012 */
X	0x066,0x066,0x066,0x066,0x066,0x000,0x066,0x000,	/* 013 */
X	0x07F,0x000,0x000,0x07B,0x01B,0x01B,0x01B,0x000,	/* 014 */
X	0x03E,0x063,0x038,0x06C,0x06C,0x038,0x0CC,0x078,	/* 015 */
X	0x000,0x000,0x000,0x000,0x07E,0x07E,0x07E,0x000,	/* 016 */
X	0x018,0x03C,0x07E,0x018,0x07E,0x03C,0x018,0x0FF,	/* 017 */
X	0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x000,	/* 018 */
X	0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,	/* 019 */
X	0x000,0x018,0x00C,0x0FE,0x00C,0x018,0x000,0x000,	/* 01A */
X	0x000,0x030,0x060,0x0FE,0x060,0x030,0x000,0x000,	/* 01B */
X	0x000,0x000,0x0C0,0x0C0,0x0C0,0x0FE,0x000,0x000,	/* 01C */
X	0x000,0x024,0x066,0x0FF,0x066,0x024,0x000,0x000,	/* 01D */
X	0x000,0x018,0x03C,0x07E,0x0FF,0x0FF,0x000,0x000,	/* 01E */
X	0x000,0x0FF,0x0FF,0x07E,0x03C,0x018,0x000,0x000,	/* 01F */
X	0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,	/* 020 */
X	0x030,0x078,0x078,0x030,0x030,0x000,0x030,0x000,	/* 021 */
X	0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000,0x000,	/* 022 */
X	0x06C,0x06C,0x0FE,0x06C,0x0FE,0x06C,0x06C,0x000,	/* 023 */
X	0x030,0x07C,0x0C0,0x078,0x00C,0x0F8,0x030,0x000,	/* 024 */
X	0x000,0x0C6,0x0CC,0x018,0x030,0x066,0x0C6,0x000,	/* 025 */
X	0x038,0x06C,0x038,0x076,0x0DC,0x0CC,0x076,0x000,	/* 026 */
X	0x060,0x060,0x0C0,0x000,0x000,0x000,0x000,0x000,	/* 027 */
X	0x018,0x030,0x060,0x060,0x060,0x030,0x018,0x000,	/* 028 */
X	0x060,0x030,0x018,0x018,0x018,0x030,0x060,0x000,	/* 029 */
X	0x000,0x066,0x03C,0x0FF,0x03C,0x066,0x000,0x000,	/* 02A */
X	0x000,0x030,0x030,0x0FC,0x030,0x030,0x000,0x000,	/* 02B */
X	0x000,0x000,0x000,0x000,0x000,0x030,0x030,0x060,	/* 02C */
X	0x000,0x000,0x000,0x0FC,0x000,0x000,0x000,0x000,	/* 02D */
X	0x000,0x000,0x000,0x000,0x000,0x030,0x030,0x000,	/* 02E */
X	0x006,0x00C,0x018,0x030,0x060,0x0C0,0x080,0x000,	/* 02F */
X	0x07C,0x0C6,0x0CE,0x0DE,0x0F6,0x0E6,0x07C,0x000,	/* 030 */
X	0x030,0x070,0x030,0x030,0x030,0x030,0x0FC,0x000,	/* 031 */
X	0x078,0x0CC,0x00C,0x038,0x060,0x0CC,0x0FC,0x000,	/* 032 */
X	0x078,0x0CC,0x00C,0x038,0x00C,0x0CC,0x078,0x000,	/* 033 */
X	0x01C,0x03C,0x06C,0x0CC,0x0FE,0x00C,0x01E,0x000,	/* 034 */
X	0x0FC,0x0C0,0x0F8,0x00C,0x00C,0x0CC,0x078,0x000,	/* 035 */
X	0x038,0x060,0x0C0,0x0F8,0x0CC,0x0CC,0x078,0x000,	/* 036 */
X	0x0FC,0x0CC,0x00C,0x018,0x030,0x030,0x030,0x000,	/* 037 */
X	0x078,0x0CC,0x0CC,0x078,0x0CC,0x0CC,0x078,0x000,	/* 038 */
X	0x078,0x0CC,0x0CC,0x07C,0x00C,0x018,0x070,0x000,	/* 039 */
X	0x000,0x030,0x030,0x000,0x000,0x030,0x030,0x000,	/* 03A */
X	0x000,0x030,0x030,0x000,0x000,0x030,0x030,0x060,	/* 03B */
X	0x018,0x030,0x060,0x0C0,0x060,0x030,0x018,0x000,	/* 03C */
X	0x000,0x000,0x0FC,0x000,0x000,0x0FC,0x000,0x000,	/* 03D */
X	0x060,0x030,0x018,0x00C,0x018,0x030,0x060,0x000,	/* 03E */
X	0x078,0x0CC,0x00C,0x018,0x030,0x000,0x030,0x000,	/* 03F */
X	0x07C,0x0C6,0x0DE,0x0DE,0x0DE,0x0C0,0x078,0x000,	/* 040 */
X	0x030,0x078,0x0CC,0x0CC,0x0FC,0x0CC,0x0CC,0x000,	/* 041 */
X	0x0FC,0x066,0x066,0x07C,0x066,0x066,0x0FC,0x000,	/* 042 */
X	0x03C,0x066,0x0C0,0x0C0,0x0C0,0x066,0x03C,0x000,	/* 043 */
X	0x0F8,0x06C,0x066,0x066,0x066,0x06C,0x0F8,0x000,	/* 044 */
X	0x0FE,0x062,0x068,0x078,0x068,0x062,0x0FE,0x000,	/* 045 */
X	0x0FE,0x062,0x068,0x078,0x068,0x060,0x0F0,0x000,	/* 046 */
X	0x03C,0x066,0x0C0,0x0C0,0x0CE,0x066,0x03E,0x000,	/* 047 */
X	0x0CC,0x0CC,0x0CC,0x0FC,0x0CC,0x0CC,0x0CC,0x000,	/* 048 */
X	0x078,0x030,0x030,0x030,0x030,0x030,0x078,0x000,	/* 049 */
X	0x01E,0x00C,0x00C,0x00C,0x0CC,0x0CC,0x078,0x000,	/* 04A */
X	0x0E6,0x066,0x06C,0x078,0x06C,0x066,0x0E6,0x000,	/* 04B */
X	0x0F0,0x060,0x060,0x060,0x062,0x066,0x0FE,0x000,	/* 04C */
X	0x0C6,0x0EE,0x0FE,0x0FE,0x0D6,0x0C6,0x0C6,0x000,	/* 04D */
X	0x0C6,0x0E6,0x0F6,0x0DE,0x0CE,0x0C6,0x0C6,0x000,	/* 04E */
X	0x038,0x06C,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x000,	/* 04F */
X	0x0FC,0x066,0x066,0x07C,0x060,0x060,0x0F0,0x000,	/* 050 */
X	0x078,0x0CC,0x0CC,0x0CC,0x0DC,0x078,0x01C,0x000,	/* 051 */
X	0x0FC,0x066,0x066,0x07C,0x06C,0x066,0x0E6,0x000,	/* 052 */
X	0x078,0x0CC,0x0E0,0x070,0x01C,0x0CC,0x078,0x000,	/* 053 */
X	0x0FC,0x0B4,0x030,0x030,0x030,0x030,0x078,0x000,	/* 054 */
X	0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0FC,0x000,	/* 055 */
X	0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x078,0x030,0x000,	/* 056 */
X	0x0C6,0x0C6,0x0C6,0x0D6,0x0FE,0x0EE,0x0C6,0x000,	/* 057 */
X	0x0C6,0x0C6,0x06C,0x038,0x038,0x06C,0x0C6,0x000,	/* 058 */
X	0x0CC,0x0CC,0x0CC,0x078,0x030,0x030,0x078,0x000,	/* 059 */
X	0x0FE,0x0C6,0x08C,0x018,0x032,0x066,0x0FE,0x000,	/* 05A */
X	0x078,0x060,0x060,0x060,0x060,0x060,0x078,0x000,	/* 05B */
X	0x0C0,0x060,0x030,0x018,0x00C,0x006,0x002,0x000,	/* 05C */
X	0x078,0x018,0x018,0x018,0x018,0x018,0x078,0x000,	/* 05D */
X	0x010,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x000,	/* 05E */
X	0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,	/* 05F */
X	0x030,0x030,0x018,0x000,0x000,0x000,0x000,0x000,	/* 060 */
X	0x000,0x000,0x078,0x00C,0x07C,0x0CC,0x076,0x000,	/* 061 */
X	0x0E0,0x060,0x060,0x07C,0x066,0x066,0x0DC,0x000,	/* 062 */
X	0x000,0x000,0x078,0x0CC,0x0C0,0x0CC,0x078,0x000,	/* 063 */
X	0x01C,0x00C,0x00C,0x07C,0x0CC,0x0CC,0x076,0x000,	/* 064 */
X	0x000,0x000,0x078,0x0CC,0x0FC,0x0C0,0x078,0x000,	/* 065 */
X	0x038,0x06C,0x060,0x0F0,0x060,0x060,0x0F0,0x000,	/* 066 */
X	0x000,0x000,0x076,0x0CC,0x0CC,0x07C,0x00C,0x0F8,	/* 067 */
X	0x0E0,0x060,0x06C,0x076,0x066,0x066,0x0E6,0x000,	/* 068 */
X	0x030,0x000,0x070,0x030,0x030,0x030,0x078,0x000,	/* 069 */
X	0x00C,0x000,0x00C,0x00C,0x00C,0x0CC,0x0CC,0x078,	/* 06A */
X	0x0E0,0x060,0x066,0x06C,0x078,0x06C,0x0E6,0x000,	/* 06B */
X	0x070,0x030,0x030,0x030,0x030,0x030,0x078,0x000,	/* 06C */
X	0x000,0x000,0x0CC,0x0FE,0x0FE,0x0D6,0x0C6,0x000,	/* 06D */
X	0x000,0x000,0x0F8,0x0CC,0x0CC,0x0CC,0x0CC,0x000,	/* 06E */
X	0x000,0x000,0x078,0x0CC,0x0CC,0x0CC,0x078,0x000,	/* 06F */
X	0x000,0x000,0x0DC,0x066,0x066,0x07C,0x060,0x0F0,	/* 070 */
X	0x000,0x000,0x076,0x0CC,0x0CC,0x07C,0x00C,0x01E,	/* 071 */
X	0x000,0x000,0x0DC,0x076,0x066,0x060,0x0F0,0x000,	/* 072 */
X	0x000,0x000,0x07C,0x0C0,0x078,0x00C,0x0F8,0x000,	/* 073 */
X	0x010,0x030,0x07C,0x030,0x030,0x034,0x018,0x000,	/* 074 */
X	0x000,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,	/* 075 */
X	0x000,0x000,0x0CC,0x0CC,0x0CC,0x078,0x030,0x000,	/* 076 */
X	0x000,0x000,0x0C6,0x0D6,0x0FE,0x0FE,0x06C,0x000,	/* 077 */
X	0x000,0x000,0x0C6,0x06C,0x038,0x06C,0x0C6,0x000,	/* 078 */
X	0x000,0x000,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x0F8,	/* 079 */
X	0x000,0x000,0x0FC,0x098,0x030,0x064,0x0FC,0x000,	/* 07A */
X	0x01C,0x030,0x030,0x0E0,0x030,0x030,0x01C,0x000,	/* 07B */
X	0x018,0x018,0x018,0x000,0x018,0x018,0x018,0x000,	/* 07C */
X	0x0E0,0x030,0x030,0x01C,0x030,0x030,0x0E0,0x000,	/* 07D */
X	0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000,	/* 07E */
X	0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x000,	/* 07F */
X	0x078,0x0CC,0x0C0,0x0CC,0x078,0x018,0x00C,0x078,	/* 080 */
X	0x000,0x066,0x000,0x066,0x066,0x066,0x03F,0x000,	/* 081 */
X	0x00E,0x000,0x03C,0x066,0x07E,0x060,0x03C,0x000,	/* 082 */
X	0x07E,0x0C3,0x03C,0x006,0x03E,0x066,0x03F,0x000,	/* 083 */
X	0x066,0x000,0x03C,0x006,0x03E,0x066,0x03F,0x000,	/* 084 */
X	0x070,0x000,0x03C,0x006,0x03E,0x066,0x03F,0x000,	/* 085 */
X	0x018,0x018,0x03C,0x006,0x03E,0x066,0x03F,0x000,	/* 086 */
X	0x000,0x000,0x03C,0x060,0x060,0x03C,0x006,0x01C,	/* 087 */
X	0x07E,0x0C3,0x03C,0x066,0x07E,0x060,0x03C,0x000,	/* 088 */
X	0x066,0x000,0x03C,0x066,0x07E,0x060,0x03C,0x000,	/* 089 */
X	0x070,0x000,0x03C,0x066,0x07E,0x060,0x03C,0x000,	/* 08A */
X	0x066,0x000,0x038,0x018,0x018,0x018,0x03C,0x000,	/* 08B */
X	0x07C,0x0C6,0x038,0x018,0x018,0x018,0x03C,0x000,	/* 08C */
X	0x070,0x000,0x038,0x018,0x018,0x018,0x03C,0x000,	/* 08D */
X	0x063,0x01C,0x036,0x063,0x07F,0x063,0x063,0x000,	/* 08E */
X	0x018,0x018,0x000,0x03C,0x066,0x07E,0x066,0x000,	/* 08F */
X	0x00E,0x000,0x07E,0x030,0x03C,0x030,0x07E,0x000,	/* 090 */
X	0x000,0x000,0x07F,0x00C,0x07F,0x0CC,0x07F,0x000,	/* 091 */
X	0x01F,0x036,0x066,0x07F,0x066,0x066,0x067,0x000,	/* 092 */
X	0x03C,0x066,0x000,0x03C,0x066,0x066,0x03C,0x000,	/* 093 */
X	0x000,0x066,0x000,0x03C,0x066,0x066,0x03C,0x000,	/* 094 */
X	0x000,0x070,0x000,0x03C,0x066,0x066,0x03C,0x000,	/* 095 */
X	0x03C,0x066,0x000,0x066,0x066,0x066,0x03F,0x000,	/* 096 */
X	0x000,0x070,0x000,0x066,0x066,0x066,0x03F,0x000,	/* 097 */
X	0x000,0x066,0x000,0x066,0x066,0x03E,0x006,0x07C,	/* 098 */
X	0x0C3,0x018,0x03C,0x066,0x066,0x03C,0x018,0x000,	/* 099 */
X	0x066,0x000,0x066,0x066,0x066,0x066,0x03C,0x000,	/* 09A */
X	0x018,0x018,0x07E,0x0C0,0x0C0,0x07E,0x018,0x018,	/* 09B */
X	0x01C,0x036,0x032,0x078,0x030,0x073,0x07E,0x000,	/* 09C */
X	0x066,0x066,0x03C,0x07E,0x018,0x07E,0x018,0x018,	/* 09D */
X	0x0F8,0x0CC,0x0CC,0x0FA,0x0C6,0x0CF,0x0C6,0x0C7,	/* 09E */
X	0x00E,0x01B,0x018,0x03C,0x018,0x018,0x0D8,0x070,	/* 09F */
X	0x00E,0x000,0x03C,0x006,0x03E,0x066,0x03F,0x000,	/* 0A0 */
X	0x01C,0x000,0x038,0x018,0x018,0x018,0x03C,0x000,	/* 0A1 */
X	0x000,0x00E,0x000,0x03C,0x066,0x066,0x03C,0x000,	/* 0A2 */
X	0x000,0x00E,0x000,0x066,0x066,0x066,0x03F,0x000,	/* 0A3 */
X	0x000,0x07C,0x000,0x07C,0x066,0x066,0x066,0x000,	/* 0A4 */
X	0x07E,0x000,0x066,0x076,0x07E,0x06E,0x066,0x000,	/* 0A5 */
X	0x03C,0x06C,0x06C,0x03E,0x000,0x07E,0x000,0x000,	/* 0A6 */
X	0x038,0x06C,0x06C,0x038,0x000,0x07C,0x000,0x000,	/* 0A7 */
X	0x018,0x000,0x018,0x030,0x060,0x066,0x03C,0x000,	/* 0A8 */
X	0x000,0x000,0x000,0x07E,0x060,0x060,0x000,0x000,	/* 0A9 */
X	0x000,0x000,0x000,0x07E,0x006,0x006,0x000,0x000,	/* 0AA */
X	0x0C3,0x0C6,0x0CC,0x0DE,0x033,0x066,0x0CC,0x00F,	/* 0AB */
X	0x0C3,0x0C6,0x0CC,0x000,0x037,0x06F,0x0CF,0x003,	/* 0AC */
X	0x018,0x018,0x000,0x018,0x018,0x018,0x018,0x000,	/* 0AD */
X	0x000,0x033,0x066,0x0CC,0x066,0x033,0x000,0x000,	/* 0AE */
X	0x000,0x0CC,0x066,0x033,0x066,0x0CC,0x000,0x000,	/* 0AF */
X	0x022,0x088,0x022,0x088,0x022,0x088,0x022,0x088,	/* 0B0 */
X	0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,	/* 0B1 */
X	0x000,0x077,0x000,0x0EE,0x000,0x077,0x000,0x0EE,	/* 0B2 */
X	0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,	/* 0B3 */
X	0x018,0x018,0x018,0x018,0x0F8,0x018,0x018,0x018,	/* 0B4 */
X	0x018,0x018,0x0F8,0x018,0x0F8,0x018,0x018,0x018,	/* 0B5 */
X	0x036,0x036,0x036,0x036,0x0F6,0x036,0x036,0x036,	/* 0B6 */
X	0x000,0x000,0x000,0x000,0x0FE,0x036,0x036,0x036,	/* 0B7 */
X	0x000,0x000,0x0F8,0x018,0x0F8,0x018,0x018,0x018,	/* 0B8 */
X	0x036,0x036,0x0F6,0x006,0x0F6,0x036,0x036,0x036,	/* 0B9 */
X	0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,	/* 0BA */
X	0x000,0x000,0x0FE,0x006,0x0F6,0x036,0x036,0x036,	/* 0BB */
X	0x036,0x036,0x0F6,0x006,0x0FE,0x000,0x000,0x000,	/* 0BC */
X	0x036,0x036,0x036,0x036,0x0FE,0x000,0x000,0x000,	/* 0BD */
X	0x018,0x018,0x0F8,0x018,0x0F8,0x000,0x000,0x000,	/* 0BE */
X	0x000,0x000,0x000,0x000,0x0F8,0x018,0x018,0x018,	/* 0BF */
X	0x018,0x018,0x018,0x018,0x01F,0x000,0x000,0x000,	/* 0C0 */
X	0x018,0x018,0x018,0x018,0x0FF,0x000,0x000,0x000,	/* 0C1 */
X	0x000,0x000,0x000,0x000,0x0FF,0x018,0x018,0x018,	/* 0C2 */
X	0x018,0x018,0x018,0x018,0x01F,0x018,0x018,0x018,	/* 0C3 */
X	0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,	/* 0C4 */
X	0x018,0x018,0x018,0x018,0x0FF,0x018,0x018,0x018,	/* 0C5 */
X	0x018,0x018,0x01F,0x018,0x01F,0x018,0x018,0x018,	/* 0C6 */
X	0x036,0x036,0x036,0x036,0x037,0x036,0x036,0x036,	/* 0C7 */
X	0x036,0x036,0x037,0x030,0x03F,0x000,0x000,0x000,	/* 0C8 */
X	0x000,0x000,0x03F,0x030,0x037,0x036,0x036,0x036,	/* 0C9 */
X	0x036,0x036,0x0F7,0x000,0x0FF,0x000,0x000,0x000,	/* 0CA */
X	0x000,0x000,0x0FF,0x000,0x0F7,0x036,0x036,0x036,	/* 0CB */
X	0x036,0x036,0x037,0x030,0x037,0x036,0x036,0x036,	/* 0CC */
X	0x000,0x000,0x0FF,0x000,0x0FF,0x000,0x000,0x000,	/* 0CD */
X	0x036,0x036,0x0F7,0x000,0x0F7,0x036,0x036,0x036,	/* 0CE */
X	0x018,0x018,0x0FF,0x000,0x0FF,0x000,0x000,0x000,	/* 0CF */
X	0x036,0x036,0x036,0x036,0x0FF,0x000,0x000,0x000,	/* 0D0 */
X	0x000,0x000,0x0FF,0x000,0x0FF,0x018,0x018,0x018,	/* 0D1 */
X	0x000,0x000,0x000,0x000,0x0FF,0x036,0x036,0x036,	/* 0D2 */
X	0x036,0x036,0x036,0x036,0x03F,0x000,0x000,0x000,	/* 0D3 */
X	0x018,0x018,0x01F,0x018,0x01F,0x000,0x000,0x000,	/* 0D4 */
X	0x000,0x000,0x01F,0x018,0x01F,0x018,0x018,0x018,	/* 0D5 */
X	0x000,0x000,0x000,0x000,0x03F,0x036,0x036,0x036,	/* 0D6 */
X	0x036,0x036,0x036,0x036,0x0FF,0x036,0x036,0x036,	/* 0D7 */
X	0x018,0x018,0x0FF,0x018,0x0FF,0x018,0x018,0x018,	/* 0D8 */
X	0x018,0x018,0x018,0x018,0x0F8,0x000,0x000,0x000,	/* 0D9 */
X	0x000,0x000,0x000,0x000,0x01F,0x018,0x018,0x018,	/* 0DA */
X	0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,	/* 0 */
X	0x000,0x000,0x000,0x000,0x0FF,0x0FF,0x0FF,0x0FF,	/* 0DC */
X	0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,	/* 0DD */
X	0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,	/* 0DE */
X	0x0FF,0x0FF,0x0FF,0x0FF,0x000,0x000,0x000,0x000,	/* 0DF */
X	0x000,0x000,0x03B,0x06E,0x064,0x06E,0x03B,0x000,	/* 0E0 */
X	0x000,0x03C,0x066,0x07C,0x066,0x07C,0x060,0x060,	/* 0E1 */
X	0x000,0x07E,0x066,0x060,0x060,0x060,0x060,0x000,	/* 0E2 */
X	0x000,0x07F,0x036,0x036,0x036,0x036,0x036,0x000,	/* 0E3 */
X	0x07E,0x066,0x030,0x018,0x030,0x066,0x07E,0x000,	/* 0E4 */
X	0x000,0x000,0x03F,0x06C,0x06C,0x06C,0x038,0x000,	/* 0E5 */
X	0x000,0x033,0x033,0x033,0x033,0x03E,0x030,0x060,	/* 0E6 */
X	0x000,0x03B,0x06E,0x00C,0x00C,0x00C,0x00C,0x000,	/* 0E7 */
X	0x07E,0x018,0x03C,0x066,0x066,0x03C,0x018,0x07E,	/* 0E8 */
X	0x01C,0x036,0x063,0x07F,0x063,0x036,0x01C,0x000,	/* 0E9 */
X	0x01C,0x036,0x063,0x063,0x036,0x036,0x077,0x000,	/* 0EA */
X	0x00E,0x018,0x00C,0x03E,0x066,0x066,0x03C,0x000,	/* 0EB */
X	0x000,0x000,0x07E,0x000,0x000,0x07E,0x000,0x000,	/* 0EC */
X	0x006,0x00C,0x07E,0x000,0x000,0x07E,0x060,0x0C0,	/* 0ED */
X	0x01C,0x060,0x0C0,0x0FC,0x0C0,0x060,0x01C,0x000,	/* 0EE */
X	0x03C,0x066,0x066,0x066,0x066,0x066,0x066,0x000,	/* 0EF */
X	0x000,0x07E,0x000,0x07E,0x000,0x07E,0x000,0x000,	/* 0F0 */
X	0x018,0x018,0x07E,0x018,0x018,0x000,0x07E,0x000,	/* 0F1 */
X	0x030,0x018,0x00C,0x018,0x030,0x000,0x07E,0x000,	/* 0F2 */
X	0x00C,0x018,0x030,0x018,0x00C,0x000,0x07E,0x000,	/* 0F3 */
X	0x00E,0x01B,0x01B,0x018,0x018,0x018,0x018,0x018,	/* 0F4 */
X	0x018,0x018,0x018,0x018,0x018,0x0D8,0x0D8,0x070,	/* 0F5 */
X	0x018,0x018,0x000,0x07E,0x000,0x018,0x018,0x000,	/* 0F6 */
X	0x000,0x076,0x0DC,0x000,0x076,0x0DC,0x000,0x000,	/* 0F7 */
X	0x038,0x06C,0x06C,0x038,0x000,0x000,0x000,0x000,	/* 0F8 */
X	0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,	/* 0F9 */
X	0x000,0x000,0x000,0x000,0x018,0x000,0x000,0x000,	/* 0FA */
X	0x00F,0x00C,0x00C,0x00C,0x0EC,0x06C,0x03C,0x01C,	/* 0FB */
X	0x078,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,	/* 0FC */
X	0x070,0x018,0x030,0x060,0x078,0x000,0x000,0x000,	/* 0FD */
X	0x000,0x000,0x03C,0x03C,0x03C,0x03C,0x000,0x000,	/* 0FE */
X	0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000		/* 0FF */
X};
XxX--EOF--XxX
echo restoring graphics.h
sed 's/^X//' > graphics.h <<XxX--EOF--XxX
X/*	@(#) graphics.h 4.5 88/06/19	*/
X/*
X *	Copyright (c) David T. Lewis 1987, 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X
X/* Define variables used in translation from 3D world coordinates 	*/
X/* through several steps to reach the screen.				*/
X/* Sun Dec 20 18:31:11 EST 1987						*/
X/* system5 dtlewis 2 2.2-U AT						*/
X/*	dtlewis 6-28-87 */
X
X#include "bitmaps.h"
X
X#define PRINTPROG "/usr/bin/lp"
X
X/*
X *	The following are for MIX-C on MS-DOS.
X */
X#define DOS 0x021
X#define VIDEO_BIOS 0x010
X#define SET_VIDEO_MODE 0x00
X#define WRT_PIXEL 0x0C
X
X/*
X *	Mode definitions.
X */
X#define CGA_HI_RES_MODE 0x06
X#define CGA_COLOR_MODE 0x04
X#define EGA_COLOR_MODE 0x010
X#define HERC_GRAF_MODE 0x08
X#define COLOR_TEXT 0x03
X#define MONO_TEXT 0x02
X#define IBM_PRINTER 0x100
X
X/*
X *	The following are masks for the four possible 2-bit pixel
X *	positions in CGA 320x200 mode.
X */
X#define PIX0 0x0C0
X#define PIX1 0x030
X#define PIX2 0x0C
X#define PIX3 0x03
X
X/*
X *	Define range of the normalized 2D coordinate system
X */
X#define NORM_X_MIN 0
X#define NORM_Y_MIN 0
X#define NORM_X_MAX 32767
X#define NORM_Y_MAX 32767
X#define NORM_X_RANGE 0x7FFFL
X#define NORM_Y_RANGE 0x7FFFL
X
X#define X_CELL_BITS 8		/* Number of bits per character cell	*/
X				/* in X direction.			*/
X
X#define Y_CELL_BITS 8		/* Number of bits per character cell	*/
X				/* in Y direction.			*/
X
X/* Define transforms for normalized 2-D drawing space to pixel space.	*/
X/* These routines convert from normalized (x,y) coordinates to local	*/
X/* screen pixel coordinates.  The normalized coordinate system extends	*/
X/* from 0 to 32767 in the x direction, and from 0 to 32767 in the	*/
X/* downward y direction,  with the origin at the upper left of the	*/
X/* screen.  Screen aspect ratio is not taken into account.		*/
X
X#define conv_x_coord(x) ((int)((long)(x * graphics.x_extent) / NORM_X_RANGE))
X#define conv_y_coord(y) ((int)((long)(y * graphics.y_extent) / NORM_Y_RANGE))
X
X/* Enumerated data type for pixel setting mode. 			*/
Xenum PIX_MODE {OR, XOR};
X
X/* The following structure defines variables used for video support.	*/
X
Xstruct SVAT_graphics	{
X
X	CGA_BUF_TYPE *cgamem;	/* Pointer to video memory segment.	*/
X				/* Will be used by the write_pixel() 	*/
X				/* routine.				*/
X
X	EGA_BUF_TYPE *egamem;	/* Pointer to video memory segment.	*/
X				/* Will be used by the write_pixel() 	*/
X				/* routine.				*/
X
X	HERC_BUF_TYPE *hercmem;	/* Pointer to video memory segment.	*/
X				/* Will be used by the write_pixel() 	*/
X				/* routine.				*/
X
X	PR_BUF_TYPE *printbuf1,	/* Pointers to printer bit map segment.	*/
X		*printbuf2,	/* Will be used by the write_pixel() 	*/
X		*printbuf3;	/* routine.				*/
X
X	int x_cursor;		/* Graphics cursor position in pixel	*/
X				/* units on x axis.			*/
X	int y_cursor;		/* Graphics cursor position in pixel	*/
X				/* units on y axis.			*/
X
X	/* Definition of the virtual screen space.  This will usually	*/
X	/* be set to (0,0) at the lower left of the screen and		*/
X	/* (32767,32767) at the upper right, regardless of aspect 	*/
X	/* ratio of the physical screen.				*/
X
X	int	x_extent,	/* Width and height of screen in units	*/
X		y_extent;	/* of pixels.				*/
X
X	float	aspect_ratio;	/* Height of screen divided by width.	*/
X
X	/* Variables used for coordinate transformations.		*/
X
X	float	xlate_x,	/* Translation prior to rotation and	*/
X		xlate_y,	/* scaling, perspective, viewports, and	*/
X		xlate_z;	/* windows.				*/
X
X	float	offset_x,	/* Offset from origin of world 		*/
X		offset_y,	/* coordinates	(after translation), 	*/
X		offset_z;	/* about which we will rotate, scale, 	*/
X				/* and do perspective.			*/
X
X	float	theta_x,	/* Angle of rotation about x axis.	*/
X				/* (z to y right hand rule.)		*/
X		theta_y,	/* Angle of rotation about y axis.	*/
X				/* (z to x right hand rule.)		*/
X		theta_z;	/* Angle of rotation about x axis.	*/
X				/* (x to y right hand rule.)		*/
X
X	/* Factors used in the 3D to 2D rotation matrix.  We want to	*/
X	/* calculate them once, then use them repeatedly.		*/
X
X	float	c_tz_c_ty,	/* cos(theta_z)*cos(theta_y)		*/
X		s_tz,		/* sin(theta_z)				*/
X		s_ty,		/* sin(theta_y)				*/
X		c_tz_c_tx,	/* cos(theta_z)*cos(theta_x)		*/
X		s_tx;		/* sin(theta_x)				*/
X
X	float	scale_factor;	/* Scaling factor, after rotation,	*/
X				/* before perspective.			*/
X
X	float	perspect_dist;	/* Perspective viewing distance.	*/
X
X	int	x_vport_ll,	/* Lower left and upper right x and y	*/
X		y_vport_ll,	/* coordinates of the viewport in the	*/
X		x_vport_ur,	/* normalized coordinate space.		*/
X		y_vport_ur;
X
X	int	x_window_ll,	/* Lower left and upper right x and y	*/
X		y_window_ll,	/* coordinates of the active windo in	*/
X		x_window_ur,	/* terms of normalized coordinate	*/
X		y_window_ur;	/* space.				*/
X
X	/* Drawing control variables.					*/
X
X	int grafmode;	 	/* Video display mode			*/
X
X	int color;		/* Color of line to draw		*/
X
X	int lineweight;		/* Line thickness			*/
X
X	long linestyle;		/* Line style (e.g. dot-dash)		*/
X
X	enum PIX_MODE wrt_mode; /* Pixel writing mode (OR, XOR)		*/
X
X	struct  {
X		int xtic;	/* Character to character distance	*/
X		int ytic;	/* Line to line distance		*/
X		int xsize;	/* Vertical character size		*/
X		int ysize;	/* Horizontal character size		*/
X		float angle;	/* Rotation angle of text line, in	*/
X				/* counterclockwise radians.		*/
X		float slant;	/* Char slant angle, in clockwise	*/
X				/* radians.				*/
X	} strokefont;
X
X	struct  {
X		int chars_per_line;
X		int lines_per_screen;
X		int xtic;	/* Character to character distance	*/
X		int ytic;	/* Line to line distance		*/
X		int xmult;	/* If 2, then make double wide, etc.	*/
X		int ymult;	/* If 2, then make double high, etc.	*/
X	} cellfont;
X};
XxX--EOF--XxX
echo restoring pix_color.c
sed 's/^X//' > pix_color.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) pix_color.c 1.3 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/*
X *	This routine sets the color to be used for all pixel operations.
X *	Color is (unfortunately) nothing more than a 16 bit integer, and
X *	may display different results on different graphics adapters.
X *	No attempt has been made to correlate colors between CGA, EGA
X *	or any other adapter, in part because the author is developing
X *	the code on a machine with only monochrome graphics (Everex
X *	Edge).
X *
X *	The returned value is the previous color setting.
X */
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
X
Xint pix_color(color)
Xint color;
X{
X	int last_color;
X	last_color = graphics.color;
X	graphics.color = color;
X	if (graphics.grafmode == EGA_COLOR_MODE)  {
X		/* Write to EGA registers.  Not yet implemented. */
X		/* Ditto for VGA. */
X	}
X	return(last_color);
X}
XxX--EOF--XxX
echo restoring pix_mode.c
sed 's/^X//' > pix_mode.c <<XxX--EOF--XxX
X#ifndef lint
Xstatic char sccsid[] = "@(#) pix_mode.c 1.3 88/06/19";
X#endif
X
X/*
X *	Copyright (c) David T. Lewis 1988
X *	All rights reserved.
X *
X *	Permission is granted to use this for any personal noncommercial use.
X *	You may not distribute source or executable code for profit, nor
X *	may you distribute it with a commercial product without the written
X *	consent of the author.  Please send modifications to the author for
X *	inclusion in updates to the program.  Thanks.
X */
X
X/*
X *	This routine sets us up to update pixels in either OR mode 
X *	(set the pixel on, regardless of previous state), or XOR mode
X *	(pixel is XORed with its previous value).  XOR mode is used for
X *	things like graphics cursors which may be placed on the screen
X *	without destroying the previous screen contents.
X *
X *	The returned value is the previous state of the pixel mode.
X */
X
X#include "graphics.h"
X
Xextern struct SVAT_graphics graphics;
X
Xenum PIX_MODE pix_mode(mode_val)
Xenum PIX_MODE mode_val;
X{
X	enum PIX_MODE last_mode;
X	last_mode = graphics.wrt_mode;
X	switch (mode_val)  {
X		case OR:
X			graphics.wrt_mode = OR;
X			break;
X		case XOR:
X			graphics.wrt_mode = XOR;
X			break;
X		default:
X			graphics.wrt_mode = OR;
X			break;
X	}
X	return(last_mode);
X}
XxX--EOF--XxX
-- 
Dave Lewis
Ann Arbor, MI
...![ itivax umix ]!m-net!dtlewis!lewis

lewis@m2-net.UUCP (Dave Lewis) (07/01/88)

------------------------------  cut here  ------------------------------
# To recover, type "sh archive"
echo restoring font.h
sed 's/^X//' > font.h <<XxX--EOF--XxX
X/*	@(#) font.h 4.3 88/06/19	*/
X/*  
X * Copied from _Graphics_in_C_, by Nelson Johnson, 1987, McGraw-Hill, p. 592. 
X * Use is subject to conditions stated in that text.
X * Note:  The author's copyright presumes that you bought the book, which
X * is worth doing in any case.
X *
X * FONT.H contains the standard character set from ASCII 0 through 127.
X */
X/*dtl needs to be filled in with correct values.*/
X
Xunsigned stroke[128][36] = {
X/* 0 */
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 1 */
X0x0106,0x0617,0x1767,0x6776,0x7671,0x7160,
X0x6010,0x1001,0x2232,0x2535,0x4245,0x4554,
X0x5453,0x5342,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 2 */
X0x0106,0x0617,0x1767,0x6776,0x7671,0x7160,
X0x6010,0x1001,0x1113,0x1323,0x2321,0x2111,
X0x1416,0x1626,0x2624,0x2414,0x4146,0x4655,
X0x5552,0x5241,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 3 */
X0x0102,0x0213,0x1304,0x0405,0x0516,0x1636,
X0x3663,0x6330,0x3010,0x1001,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 4 */
X0x0336,0x3663,0x6330,0x3003,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 5 */
X0x0204,0x0415,0x1524,0x2434,0x3436,0x3646,
X0x4664,0x6462,0x6240,0x4030,0x3032,0x3222,
X0x2211,0x1102,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 6 */
X0x0313,0x1346,0x4664,0x6475,0x7571,0x7162,
X0x6240,0x4013,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 7 */
X0x2324,0x2435,0x3545,0x4554,0x5453,0x5342,
X0x4232,0x3223,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 8 */
X0x0007,0x0777,0x7770,0x7000,0x2225,0x2536,
X0x3646,0x4655,0x5552,0x5241,0x4131,0x3122,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 9 */
X0x1215,0x1525,0x2526,0x2656,0x5655,0x5565,
X0x6562,0x6252,0x5251,0x5121,0x2122,0x2212,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* a */
X0x0001,0x0111,0x1110,0x1000,0x0607,0x0717,
X0x1716,0x1606,0x6061,0x6171,0x7170,0x7060,
X0x6667,0x6777,0x7776,0x7666,0x2324,0x2435,
X0x3545,0x4554,0x5453,0x5342,0x4232,0x3223,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* b */
X0x0407,0x0727,0x3307,0x3134,0x3445,0x4565,
X0x6574,0x7471,0x7160,0x6040,0x4031,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* c */
X0x0205,0x0516,0x1636,0x3654,0x5331,0x3111,
X0x1102,0x5373,0x5474,0x6166,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* d */
X0x0207,0x0727,0x2722,0x2202,0x2262,0x6271,
X0x7170,0x7060,0x6051,0x5152,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* e */
X0x0207,0x0757,0x5766,0x6665,0x6555,0x5546,
X0x4647,0x2227,0x0262,0x6271,0x7170,0x7060,
X0x6051,0x5152,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* f */
X0x2225,0x2555,0x5552,0x5222,0x0022,0x0323,
X0x0424,0x0725,0x3735,0x4745,0x7755,0x7454,
X0x7353,0x7052,0x4042,0x3032,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 10 */
X0x0036,0x3660,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 11 */
X0x0630,0x3066,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 12 */
X0x0304,0x0426,0x2624,0x2454,0x5456,0x5674,
X0x7473,0x7351,0x5153,0x5323,0x2321,0x2103,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 13 */
X0x0102,0x0242,0x4241,0x4101,0x6162,0x0506,
X0x0646,0x4645,0x4505,0x6566,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 14 */
X0x0107,0x0767,0x0110,0x1020,0x2031,0x3137,
X0x0464,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 15 */
X0x1706,0x0602,0x0211,0x1122,0x2224,0x2435,
X0x3545,0x4554,0x6071,0x7174,0x7465,0x6554,
X0x5452,0x5241,0x4131,0x3122,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 16 */
X0x4146,0x4666,0x6661,0x6141,0x5156,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 17 */
X0x0304,0x0426,0x2624,0x2444,0x4446,0x4664,
X0x6463,0x6341,0x4143,0x4323,0x2321,0x2103,
X0x7077,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 18 */
X0x0304,0x0426,0x2624,0x2464,0x6463,0x6323,
X0x2321,0x2103,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 19 */
X0x0304,0x0444,0x4446,0x4664,0x6463,0x6341,
X0x4143,0x4303,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 1a */
X0x1314,0x1436,0x3654,0x5453,0x5335,0x3513,
X0x3035,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 1b */
X0x1213,0x1331,0x3153,0x5352,0x5230,0x3012,
X0x3136,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 1c */
X0x5121,0x2120,0x2050,0x5056,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 1d */
X0x1252,0x5230,0x3012,0x1537,0x3755,0x5515,
X0x3235,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 1e */
X0x1314,0x1447,0x4757,0x5750,0x5040,0x4013,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 1f */
X0x1017,0x1727,0x2754,0x5453,0x5320,0x2010,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 20 */
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 21 */
X0x0203,0x0314,0x1424,0x2433,0x3343,0x4342,
X0x4232,0x3221,0x2111,0x1102,0x6263,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 22 */
X0x0102,0x0222,0x2221,0x2101,0x0405,0x0525,
X0x2524,0x2404,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 23 */
X0x0102,0x0262,0x6261,0x6101,0x0405,0x0565,
X0x6564,0x6404,0x2026,0x4046,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 24 */
X0x1511,0x1120,0x2031,0x3134,0x3445,0x4554,
X0x5450,0x0262,0x0363,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 25 */
X0x1011,0x1121,0x2120,0x2010,0x1516,0x1661,
X0x6160,0x6015,0x5556,0x5666,0x6665,0x6555,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 26 */
X0x0204,0x0415,0x1524,0x2431,0x3140,0x4050,
X0x5061,0x6163,0x6336,0x0211,0x1166,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 27 */
X0x0102,0x0212,0x1221,0x2120,0x2011,0x1101,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 28 */
X0x0304,0x0422,0x2242,0x4264,0x6463,0x6341,
X0x4121,0x2103,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 29 */
X0x0102,0x0224,0x2444,0x4462,0x6261,0x6143,
X0x4323,0x2301,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 2a */
X0x1112,0x1256,0x5655,0x5511,0x1516,0x1652,
X0x5251,0x5115,0x3037,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 2b */
X0x1213,0x1353,0x5352,0x5212,0x3032,0x3335,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 2c */
X0x5253,0x5363,0x6372,0x7271,0x7162,0x6252,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 2d */
X0x3035,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 2e */
X0x5253,0x5363,0x6362,0x6252,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 2f */
X0x0506,0x0660,0x6050,0x5005,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 30 */
X0x0105,0x0516,0x1656,0x5665,0x6561,0x6150,
X0x5010,0x1001,0x0161,0x0565,0x5115,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 31 */
X0x0203,0x0363,0x6065,0x0262,0x0211,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 32 */
X0x1001,0x0104,0x0415,0x1525,0x2534,0x3441,
X0x4150,0x5060,0x6065,0x0434,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 33 */
X0x1001,0x0104,0x0415,0x1525,0x2534,0x3234,
X0x3445,0x4555,0x5564,0x6461,0x6150,0x0464,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 34 */
X0x0305,0x0565,0x0464,0x6366,0x0330,0x3040,
X0x4046,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 35 */
X0x0005,0x0020,0x0121,0x2024,0x2435,0x3555,
X0x5564,0x6461,0x6150,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 36 */
X0x0402,0x0220,0x2050,0x5061,0x6164,0x6455,
X0x5545,0x4534,0x3431,0x1161,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 37 */
X0x1000,0x0005,0x0525,0x2543,0x4363,0x0434,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 38 */
X0x0104,0x0415,0x1525,0x2534,0x3445,0x4555,
X0x5564,0x6461,0x6150,0x5040,0x4031,0x3120,
X0x2010,0x1001,0x0161,0x0464,0x3134,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 39 */
X0x3431,0x3120,0x2010,0x1001,0x0104,0x0415,
X0x1545,0x4563,0x6361,0x0454,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 3a */
X0x1213,0x1323,0x2322,0x2212,0x5253,0x5363,
X0x6362,0x6252,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 3b */
X0x1213,0x1323,0x2322,0x2212,0x5253,0x5363,
X0x6372,0x7271,0x7162,0x6252,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 3c */
X0x0304,0x0431,0x3164,0x6463,0x6330,0x3003,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 3d */
X0x2025,0x5055,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 3e */
X0x0102,0x0235,0x3562,0x6261,0x6134,0x3401,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 3f */
X0x1001,0x0104,0x0415,0x1525,0x2534,0x3443,
X0x0434,0x6263,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 40 */
X0x6461,0x6150,0x5010,0x1001,0x0105,0x0516,
X0x1646,0x4643,0x4323,0x2326,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 41 */
X0x0220,0x2060,0x6061,0x6111,0x0203,0x0325,
X0x2565,0x6564,0x6414,0x4144,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 42 */
X0x0005,0x0516,0x1626,0x2635,0x3532,0x3546,
X0x4656,0x5665,0x6560,0x0161,0x0262,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 43 */
X0x1605,0x0502,0x0220,0x2040,0x4062,0x6265,
X0x6556,0x1151,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 44 */
X0x0004,0x0426,0x2646,0x4664,0x6460,0x0161,
X0x0262,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 45 */
X0x0006,0x0616,0x6066,0x6656,0x0161,0x0262,
X0x3234,0x2444,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 46 */
X0x0006,0x0616,0x0161,0x0262,0x6063,0x3234,
X0x2444,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 47 */
X0x1605,0x0502,0x0220,0x2040,0x4062,0x6266,
X0x6646,0x4644,0x1151,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 48 */
X0x0001,0x0161,0x6160,0x6000,0x0405,0x0565,
X0x6564,0x6404,0x3134,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 49 */
X0x0104,0x6164,0x0262,0x0363,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 4a */
X0x0306,0x0454,0x5463,0x0555,0x5564,0x6461,
X0x6150,0x5040,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 4b */
X0x0002,0x0161,0x0262,0x6062,0x3234,0x0616,
X0x1634,0x3456,0x5666,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 4c */
X0x0003,0x0161,0x0262,0x6066,0x6646,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 4d */
X0x0001,0x0161,0x6160,0x6000,0x0506,0x0666,
X0x6665,0x6505,0x1133,0x3315,0x2143,0x4325,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 4e */
X0x0001,0x0161,0x6160,0x6000,0x0506,0x0666,
X0x6665,0x6505,0x1155,0x2165,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 4f */
X0x0204,0x0426,0x2646,0x4664,0x6462,0x6240,
X0x4020,0x2002,0x1151,0x1555,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 50 */
X0x0005,0x0516,0x1626,0x2635,0x3532,0x0161,
X0x0262,0x6063,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 51 */
X0x0104,0x0415,0x1545,0x4554,0x5451,0x5140,
X0x4010,0x1001,0x0151,0x0464,0x4363,0x6365,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 52 */
X0x0005,0x0516,0x1626,0x2635,0x3235,0x3545,
X0x4556,0x5666,0x0161,0x0262,0x6062,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 53 */
X0x1504,0x0401,0x0110,0x1020,0x2055,0x1045,
X0x4555,0x5564,0x6461,0x6150,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 54 */
X0x1000,0x0005,0x0515,0x0262,0x0363,0x6164,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 55 */
X0x0001,0x0161,0x6160,0x6000,0x0405,0x0565,
X0x6564,0x6404,0x6164,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 56 */
X0x0001,0x0151,0x0040,0x4062,0x6263,0x0405,
X0x0545,0x4563,0x0454,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 57 */
X0x0001,0x0161,0x6160,0x6000,0x0506,0x0666,
X0x6665,0x6505,0x5133,0x3355,0x6143,0x4365,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 58 */
X0x0001,0x0111,0x1133,0x3315,0x1505,0x0506,
X0x0616,0x1634,0x3444,0x4466,0x6665,0x6543,
X0x4361,0x6160,0x6042,0x4232,0x3210,0x1000,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 59 */
X0x0001,0x0121,0x2132,0x3233,0x3324,0x2404,
X0x0405,0x0525,0x2543,0x4363,0x6164,0x6242,
X0x4220,0x2000,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 5a */
X0x2000,0x0006,0x0616,0x1650,0x5056,0x5060,
X0x6066,0x6646,0x1016,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 5b */
X0x0104,0x0161,0x0262,0x6164,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 5c */
X0x0001,0x0156,0x5666,0x6600,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 5d */
X0x0104,0x0363,0x0464,0x6164,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 5e */
X0x0336,0x3635,0x3513,0x1331,0x3130,0x3003,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 5f */
X0x7077,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 60 */
X0x0203,0x0313,0x1324,0x2423,0x2312,0x1202,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 61 */
X0x2124,0x2435,0x3565,0x6566,0x2454,0x4441,
X0x4250,0x5061,0x6163,0x6354,0x5465,0x6566,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 62 */
X0x0002,0x0161,0x6160,0x6152,0x0252,0x3235,
X0x3546,0x4656,0x5665,0x6563,0x6352,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 63 */
X0x3524,0x2421,0x2130,0x3050,0x5061,0x6164,
X0x6455,0x2161,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 64 */
X0x0305,0x0454,0x5465,0x0565,0x6566,0x3431,
X0x3140,0x4050,0x5061,0x6163,0x6354,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 65 */
X0x4145,0x4535,0x3524,0x2421,0x2130,0x3050,
X0x5061,0x6164,0x2161,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 66 */
X0x1504,0x0402,0x0211,0x1161,0x6063,0x0262,
X0x3031,0x3233,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 67 */
X0x3423,0x2321,0x2130,0x3040,0x4051,0x5154,
X0x3474,0x7470,0x2625,0x2534,0x2565,0x6574,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 68 */
X0x0002,0x0161,0x0262,0x6062,0x3224,0x2425,
X0x2536,0x3666,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 69 */
X0x0203,0x0313,0x1312,0x1202,0x2223,0x2363,
X0x2262,0x2123,0x6164,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 6a */
X0x0405,0x0515,0x1514,0x1404,0x2425,0x2464,
X0x2565,0x6574,0x6473,0x7471,0x7160,0x6050,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 6b */
X0x0002,0x0161,0x0262,0x6062,0x4244,0x2644,
X0x4466,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 6c */
X0x0103,0x0262,0x0363,0x6164,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 6d */
X0x2022,0x2233,0x3363,0x3324,0x2425,0x2536,
X0x3666,0x2060,0x6061,0x6121,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 6e */
X0x2021,0x2161,0x6160,0x6020,0x3123,0x2324,
X0x2435,0x3565,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 6f */
X0x2124,0x2435,0x3555,0x5564,0x6461,0x6150,
X0x5030,0x3021,0x2161,0x2464,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 70 */
X0x2021,0x2132,0x3272,0x2171,0x7073,0x3223,
X0x2325,0x2536,0x3646,0x4655,0x5552,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 71 */
X0x2625,0x2534,0x3474,0x2575,0x7376,0x3423,
X0x2321,0x2130,0x3040,0x4051,0x5154,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 72 */
X0x2021,0x2132,0x2161,0x3262,0x6063,0x3223,
X0x2325,0x2536,0x3646,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 73 */
X0x2521,0x2130,0x3041,0x4144,0x4455,0x5564,
X0x6460,0x2141,0x4464,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 74 */
X0x0322,0x0363,0x2125,0x2252,0x5263,0x6364,
X0x6455,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 75 */
X0x2050,0x5061,0x6163,0x6354,0x2454,0x5465,
X0x6566,0x2425,0x2555,0x5566,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 76 */
X0x2040,0x4062,0x6263,0x2021,0x2141,0x4162,
X0x2545,0x4563,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 77 */
X0x2021,0x2151,0x5162,0x2050,0x5061,0x6162,
X0x6253,0x5333,0x5364,0x6465,0x6556,0x5626,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 78 */
X0x2021,0x2143,0x4361,0x6160,0x6042,0x4220,
X0x4344,0x2644,0x4466,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 79 */
X0x2040,0x4051,0x5154,0x2425,0x2565,0x6574,
X0x2474,0x7470,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 7a */
X0x3020,0x2025,0x2561,0x2460,0x6065,0x6555,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 7b */
X0x0305,0x0413,0x1323,0x2332,0x3243,0x4353,
X0x5364,0x6365,0x0312,0x1222,0x2231,0x3130,
X0x3142,0x4252,0x5263,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 7c */
X0x0304,0x0464,0x6463,0x6303,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 7d */
X0x0002,0x0112,0x1222,0x2233,0x3342,0x4252,
X0x5261,0x6062,0x0213,0x1323,0x2334,0x3435,
X0x3443,0x4353,0x5362,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 7e */
X0x0103,0x0314,0x1405,0x0506,0x0615,0x1513,
X0x1302,0x0211,0x1110,0x1001,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X/* 7f */
X0x1346,0x4666,0x6660,0x6040,0x4013,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
X0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF
X};
X
X/* END OF CHARACTER INITIALIZATION */
XxX--EOF--XxX
-- 
Dave Lewis
Ann Arbor, MI
...![ itivax umix ]!m-net!dtlewis!lewis

lewis@m-net.UUCP (Dave Lewis) (03/29/89)

> Subject: Graphics Library (part 1 of 5)
> Summary: Graphics primitives for AT class computers running uPort (Xenix?)
> Keywords: Graphics EGA CGA Hercules Printers Microport Xenix 286 386
 
In June 1988, I posted a "Graphics Library" for Microport System V/AT in the
comp.unix.microport and comp.unix.xenix newsgroups.  A second release of this 
program, enhanced and (unfortunately) modified, has just been posted to 
comp.sources.unix as "gl_plot" (v18i059).

Comments and criticism welcome.  Send to clip!m-net!dlewis!lewis (mail path 
given in the source posting has since changed).

-- 
Dave Lewis
Ann Arbor, MI
...!m-net!dtlewis!lewis