[net.sources] program to unpack MacPaint bitmaps

henry@utzoo.UUCP (Henry Spencer) (12/17/84)

I'm posting the following for a friend; comments to him directly, please.


-----
From uucp Mon Dec 17 14:00:31 1984
>From oz  Mon Dec 17 12:04:27 1984 remote from yetti
Received: by yetti.UUCP (4.12/4.7)
	id AA22945; Mon, 17 Dec 84 12:04:27 est
Date: Mon, 17 Dec 84 12:04:27 est
From: yetti!oz (Ozan Yigit)
Message-Id: <8412171704.AA22945@yetti.UUCP>
To: utzoo!henry

#!/bin/sh-----cut here-----cut here-----cut here-----cut here-----
# shar:  Shell Archiver
#        Run the following text with /bin/sh to create:
#      README #      macrst.1 #      macrst.c #      unhex.c #      HorrorCastle 
cat - << \SHAR_EOF > README
Following is a program to unpack and rasterize MacPaint  bitmaps.
The  program  is similar in structure to the one found in the Ma-
cintosh technical manual. The routine does include the C  version
of UnPackBits routine, which, to my knowledge, is not algorithmi-
cally defined anywhere.  The program internally includes a  char-
acter  and  a  plot filter to test that it works. There is also a
superb artwork called Horror Castle ((c) Ozan S.  Yigit)  in  HEX
format  for your visual enjoyment. You will need to write a small
unhex routine to convert this thing to binary,  but  that  is  no
sweat.

I would appreciate comments, bugfixes,  algorithmic  improvements
and  copies of any filters you may develop to output the macpaint
pictures to strange devices.


Oz      (wizard of something or another, no doubt..)


Ozan S. Yigit   (..utzoo!yetti!oz)
Dept. of Computer Science
York University
SHAR_EOF
cat - << \SHAR_EOF > macrst.1
.TH MACRST 1net "December 15, 1984"
.SH NAME
macrst \- Unpack and rasterize a Macintosh MACPAINT bitmap
.SH SYNOPSIS
.B macrst
macpaint_bitmap
.SH DESCRIPTION
.I macrst
unpacks a packed MacPaint bitmap (data fork) and outputs
a complete 72X720 bytes of raster image to stdout. Typically, this
output is piped to a device-specific filter.
.SH DIAGNOSTICS
Cryptic messages such as "input overflow" or "output overflow"
to indicate that the input bitmap is not reliable, the unpack
routine is out-of-synch and the input and/or output buffers are
overflowed as a result.
.SH AUTHOR
Ozan S. Yigit (utzoo!yetti!oz)
.br
York University
.br
Department of Computer Science
SHAR_EOF
cat - << \SHAR_EOF > macrst.c
/*
 * macrst - Plot/print/rasterize a MacPaint
 * bitmap. 
 *
 * Synopsis:
 *	macrst <MACPAINT BITMAP>
 *
 * Compile:
 *	cc -D[PLOT | RAST | DISP] ... [-l<plotlib>]
 *
 * A MacPaint compressed-bitmap has the following 
 * format:
 *
 *	+-----------------------+
 *	| 512 bytes of header..	|
 *	| version #, patterns	|
 *	| etc.			|
 *	+-----------------------+
 *	| 72 bytes-wide 	|
 *	| scanlines		|
 *	| compressed to 1<Nb<74	|
 *	|	    .		|
 *	|	    .		|
 *	|	   720		|
 *	|	scanlines	|
 *	|	    .		|
 *	| 	    .		|
 *	+-----------------------+ 
 *
 * As you will notice in the program, the header is completely
 * skipped. Rest of the data is scanned 720 times, generating
 * 72 bytes (unpack) each time around. When 18 scanlines are
 * generated (18 is not arbitrary, it devides 720 without a
 * remainder), they are dumped in a form suitable to your taste..
 * (Default is a raster image, as mentioned in macrst.1)
 *
 * This program is very similar to the pascal version described
 * in some Macintosh internals manual, by Bill Atkinson. To my
 * knowledge, PACK/UNPACK algorithm is described NOWHERE.
 * Unpack routine was built upon some very obscure information,
 * and a whole day's worth of trial and error, and some educated
 * guesses.. (You see, I did not have a Macintosh handy!)
 *
 * For output, define one of PLOT (Plot filters)
 *			     DISP (Character per-pixel output)
 *			     RAST (Raster image output)
 *
 * These output routines are included to demonstrate the
 * possibilities. They have no business being here, and should
 * be uncoupled. This routine should just output the unpacked
 * raster image to stdout, and a filter should be used to manipulate
 * this for a given output device. These filters may typically
 * contain two passes, one to determine the really DISPLAYABLE portion
 * of the raster, and the other to scale this portion to get the
 * maximum display coverage. 
 *
 * Author:
 *	Ozan S. Yigit
 *	utzoo!yetti!oz
 *	Dept. of Computer Science
 *	York University
 *
 * The information about the unpack routine
 * (however incomplete) was supplied by Terry Lim, 
 * a local Mac-hacker/fanatic. (utzoo!yetti!tlim)
 *
 */

#define RAST
#define CHECK

#define BIT7	0200
#define BIT6	0100
#define BIT5	0040
#define BIT4	0020
#define BIT3	0010
#define BIT2	0004
#define BIT1	0002
#define BIT0	0001

#define TRUE	1
#define FALSE	0

#define NSCAN	18		/* Number of scanlines per display buf 	*/
#define SCANS	72		/* Size of the scanline in bytes	*/
#define SCANC	720		/* Number of scanlines for Macpaint	*/
#define SBUFS	NSCAN*SCANS	/* Size of the display buffer (< IBUFS)	*/
#define IBUFS 	1536		/* Input buffer size (3 DEC blocks)	*/
#define HWATR	1024		/* High water mark for a buffer refresh */

#include <stdio.h>
main(argc,argv)
int argc;
char *argv[];
{
	register int mpp, scan, n, i;
	unsigned char srcbuf[IBUFS+1];
	unsigned char dstbuf[SBUFS+1];

	unsigned char *dpp = dstbuf;
	unsigned char *spp = srcbuf;

#ifdef CHECK
	/*
	 * This simple checkpoint mechanism is very
	 * useful in detecting problems with the input
	 * bitmap. If There are any problems,(i.e. illegal char) 
	 * the unpack routine will go haywire, screwing-up the output
	 * pointer, perhaps also forcing an erroneous amount
	 * of characters to be read. One of these checkpoints
	 * is likely to catch this.
	 */
	unsigned char *chk1= srcbuf+IBUFS;
	unsigned char *chk2= dstbuf+SBUFS;

	*chk1 = 'X';		/* source buffer overflow checkpoint	*/
	*chk2 = 'X';		/* destn. buffer overflow checkpoint    */
#endif

	if ((mpp = open(argv[1], 0)) <= 0)
		fprintf(stdout,"%s: cannot open.\n",argv[1]);
	else {
#ifdef PLOT
		openpl();
		erase();
#endif
		
		read(mpp,srcbuf, 512);	/* skip the header block */

		if (read(mpp, srcbuf, IBUFS) > 0) {
			for (scan = 0; scan < SCANC; scan++) {

				unpack(&spp, &dpp, SCANS );

				if (dpp >= dstbuf+SBUFS) { 
#ifdef CHECK
					if (*chk2 != 'X') {
						printf("Output overflow.\n");
						exit(1);
					}
#endif
#ifdef PLOT
					scanplot(dstbuf);
#endif
#ifdef DISP
					display(dstbuf);
#endif
#ifdef RAST
					write(1, dstbuf, SBUFS);
#endif
					dpp = dstbuf;
				}
				if (spp > srcbuf+HWATR) {
					register int tmp;
#ifdef DEBUG
					printf("READY TO READ NEW BLOCK\n");
#endif
					n = spp-srcbuf;
					i = IBUFS - n;
#ifdef DEBUG
					printf("Used = %d Left = %d\n",n,i);
#endif
					shift(spp, srcbuf, i);
					if((tmp=read(mpp, srcbuf+i, n)) <= 0)
						break;
#ifdef DEBUG
					printf("Read in %d bytes.\n",tmp);
#endif
#ifdef CHECK
					if (*chk1 != 'X') {
						printf("Input overflow.\n");
						exit(1);
					}
#endif
					spp = srcbuf;
				}
			}
		}
		else
			printf("Unexpected EOF.\n");
#ifdef PLOT
		closepl();
#endif
	}
}

shift(in, out, n)
unsigned char *in, *out;
register int n;
{
	while (n-- > 0)
		*out++ = *in++;
}

/*
 * unpack a bit stream a la' MAC.
 *
 * Packed format:	(X is the byte value)
 * 
 * 	X:   0-127			    128-255
 *
 *	+-------------+- - - - +	+------------+------------+
 *	| raw count   | raw    |	| repeat     |  pattern   |
 *	| copy X+1    | bytes  |	| 256-X times|	byte      |
 *	+-------------+- - - - +	+------------+------------+
 *
 *					Note that pattern byte must
 *					be output before the repeat
 *
 *	In the case of packing, n specifies the number of bytes
 *	to compact. Thus, when unpacking, this routine should 
 *	always be passed n to determine the unpacking limit.
 */

#define BIT	0200

unpack(src, dst, n)
unsigned char *src[], *dst[];
register int n;
{
	unsigned char i;
	unsigned char pat;

	do {
		i = (unsigned) *(*src)++;
		if (i & BIT) {			/* repeat factor */
				/* add 1 for the pattern itself  */
			i = 256 - (unsigned)i + 1;
			for (pat = *(*src)++; i > 0; i--, n--)
				*(*dst)++ = pat;
		}
		else { 				/* count number  */	
			i++;
#ifdef DEBUG
			printf("counting..%u (n = %u)\n",i,n);
#endif
			while (i-- > 0) {
				*(*dst)++ = *(*src)++;
				n--;
			}
		}
	} while (n > 0);
}
			
/*
 * A line-printer type display.. I would really like
 * to see a line printer to print >500 consecutive
 * characters..
 */
display(buf)
unsigned char *buf;
{
	register int i, n;

	for (i = 0; i < NSCAN; i++) {
		for (n = 0; n < SCANS; n++, buf++)
			printf("%c%c%c%c%c%c%c%c",
				((((unsigned) *buf)&BIT7) ? '#' : ' '),
				((((unsigned) *buf)&BIT6) ? '#' : ' '),
				((((unsigned) *buf)&BIT5) ? '#' : ' '),
				((((unsigned) *buf)&BIT4) ? '#' : ' '),
				((((unsigned) *buf)&BIT3) ? '#' : ' '),
				((((unsigned) *buf)&BIT2) ? '#' : ' '),
				((((unsigned) *buf)&BIT1) ? '#' : ' '),
				((((unsigned) *buf)&BIT0) ? '#' : ' '));
		putchar('\n');
	}
}

/*
 * Plot interface.. Your choice of
 * output device. It is best if the device
 * has 1/1 hor./vert. ratio.
 *
 * display is assumed to be in the first quadrant of
 * the cartesian coordinate system.
 *
 */
#ifdef PLOT
static int X = 0;
static int Y = 720;	/* assumes  >=720 pix. horizontal for output */

scanplot(buf)
unsigned char *buf;
{
	register int i, n;

	for (i = 0; i < NSCAN; i++) {
		for (n = 0; n < SCANS; n++, buf++) {
			((*buf)&BIT7) ? point(X++, Y) : X++;
			((*buf)&BIT6) ? point(X++, Y) : X++;
			((*buf)&BIT5) ? point(X++, Y) : X++;
			((*buf)&BIT4) ? point(X++, Y) : X++;
			((*buf)&BIT3) ? point(X++, Y) : X++;
			((*buf)&BIT2) ? point(X++, Y) : X++;
			((*buf)&BIT1) ? point(X++, Y) : X++;
			((*buf)&BIT0) ? point(X++, Y) : X++;
		}
		X = 0;
		Y--;
	}
}
#endif
SHAR_EOF
cat - << \SHAR_EOF > unhex.c
/* quick hex-binary converter:  assumes macintosh hex file, i.e. each line
   consists of 32 2-digit hexadecimal numbers.  output is a binary file
   suitable for processing with Ozan's mac picture printer.

   invocation:    hb <file.hex >file.bin

   terry lim 1984
*/

#include <stdio.h>

main()
{

	int i,j;
	unsigned char b;

	while (!feof(stdin))
	{
		for (i=0; i<32; i++)
		{
			scanf("%2x",&j);
			b=j;
			putchar(b);
		};
		scanf("\n");
	}
}

SHAR_EOF
cat - << \SHAR_EOF > HorrorCastle
00000002FFFFFFFFFFFFFFFFDDFF77FFDDFF77FFDD77DD77DD77DD77AA55AA55
AA55AA5555FF55FF55FF55FFAAAAAAAAAAAAAAAAEEDDBB77EEDDBB7788888888
88888888B130031BD8C00C8D8010022001084004FF888888FF888888FF808080
FF080808800000000000000080402000020408008244394482010101F8742247
8F17227155A04040550A04041422499429924428BF00BFBFB0B0B0B000000000
00000000800008008000080088002200880022008822882288228822AA00AA00
AA00AA00FF00FF00FF00FF001122448811224488FF000000FF00000001020408
10204080AA00800088008000FF80808080808080081C22C18001020488142241
8800AA0040A00000040A0000038448300C0201018080413E080814E3102054AA
FF02040877898F8F7798F8F80008142A552A1408000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900
B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900
B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900
B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900
B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900
B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900
B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900
B900B900B900B900B900B900B900B900E30001AAA8D900E300015554D900E400
000AD700E40002155554D900E400022AAAA0D900E2000014D900E400FEAAD900
B900F2000102A0F600030AAAAAA8D900F2000315500015FE00010540FD000315
555554D900F2000802A82AAAA000002AA0FD00032AAAAAA8FD0001AAA0DF00F2
000C50001555500001555000055000FE550050FE0002155550DF00F2000C2AAA
A000A8000AAAA800AAAA00FEAA05A0000002AAA0DE00F3000001FD5509000015
50140155550155FA00010554DF00F3000002FDAA04A0000002A0FC0004AAAA80
0000FDAADF00F3000005FD5508540055555415555505FE5502000015FD55DF00
F300000AFDAA01A802FEAA032AAAAA8AFEAA010000FCAADF00F3000015FD5501
5415F85502400015FC55DF00F300062A002AAAAAA82AF9AA02A00800FBAADF00
F30002015540FD000001FB550354055015FB55DF00F300FAAA02A80002FEAA03
A802AAA0FAAAFA00010AA0E800F4000001F8550050FE000301555545FA55FA00
015550FC000055EE00F4000002F1AA002AFCAA00A8F90001AAA8FD000202AA80
EF00F000FE550001F955015450FC00010154FB0002055554FD0002055540EF00
F4000002FEAAFE00012A00FAAA02A80AADFCAA00A8FB00020AAAAAFD00022AAA
A0FC00010AA0F600F4000001F9550001FC550354015557FC550050FB00FE55FD
0002555550FD0002015550F600F4000002F8AA0002FDAA0302AAAA9DFEAA0080
F900FEAAFE000302AAAAA8FD00022AAAA8F600F4000001F855045401555541FE
550677555540155540FC000005FE55FE000315555550FE000301555554F600F3
00F7AA03A800002AFEAA0C9CAA802AAAAA800000A800002AFEAA02000002FEAA
00A8FE00002AFEAAF600F200F3550054FE000015FE5505000005540000FD5502
000015FE550050FE000005FE55F600F30003AA00000AFCAAFA0001AA9DFDAA06
A800002AAA0002FDAA0200002AFEAA06A800002AAA02AAF500F300FE550040FC
00F9550077FD550650000155550015FE5502540001FE55084000000555555000
55F600F4000002F0AA009DFDAA05A000002AAA80FCAA07000AAAAA803AA000FB
AAF600F4000005F0550077FD5505000055001545FD5508540055555415755015
FB55F600F400002AF6AA01AFFEFDAA009DFDAA110002AAAA800AA8000AAAA802
AAAAA2ABEAA0FAAAF600F5000001F555027801F5FE550077FE5502540015FE55
05000555405540FE000315D7D575FB550054F600F5000002F6AA03AB80001EFE
AA00DDFEAA01A000F9AA0282802AFEAA02ABAAEAFAAAF600F5000010FC000005
FC55035C000003FE550077FE55014005F955015405FD5502D7D5D5FB550054F6
00F500002AFCAA01A80AFDAA00B0FE0003EAAAAADDFEAA01802AF9AA01A82AFD
AA01AFABFAAA00A8F600F500FA55015005FE550060FE000375555577FE550001
F8550051FC5501D757FA550050F600F6000002F9AA00A0FA00071AAAAADDAAAA
A80AF4AA03EAABEEBEFAAA00A0F600F6000005F6550057FD00060D5555775555
50F3550375555FFDFA550040F600F600042AAAA80000FAAA00AEF900022AAAA0
F3AA05BAABEFAAAAABFCAA0080F600F400040555550001FC55005CFD00060355
5577001545F355035DD57F75FA55F500F600FBAA01A80AFDAA00A8FD000601AA
AADDAA802AF3AA03AEBFBEEAFBAA00A8F500F600FA550040FD550050FC0005D5
5577555501F455065757D5FDD55575FD550050F500F600F9AA04802AAAAAA0FC
00066AAADDAAAAA802F5AA03ABAAABFFFAAA00A0F500F7000001F8550040F900
02755577FE55015005F6550457D5D5FD57FB550040F500F600F5AA00C0FC0003
2AAADDEAFEAA01A02AF9AAFE0002C081FCFC00012AAAF400F7000001F5550080
FC0002155577FC550040FE550054FE000801557555D5D7FF5757FE55014001F4
00F600F5AA0080FC00031AABDDEAFCAAFD00FAAA04FAEBFEAAAEFCAAF400F700
0001F555FB00020D5577F2550575557D55FD57FC550054F400F60004AA800000
02FBAA00ABFB00030AABDDCAF1AA03BEEBFAAEFCAA00A0F400F5000355515554
FE00FE550057FB00030D577775F3550675555F57FD5DD5FD550040F400F60002
2AAAA2FCAA030A802AAAF9000101DAF1AA04BFEFFAAEBAFDAA0080F400F60002
155501FC5502501540FA0002055776FE00F355045DF5F55D75FD55F300F60002
0AA802F8AAFB000507ADDDDAA9AAFC00002AFCAA07BEBAAAAFFFFAEFEAFDAAF3
00F4000005F9550054FB00047357777557FB550040F80002FDF5FFFD550054F3
00F400000AF9AA03AC000002FE000451DDDDDEC9F5AA00AEFEAA02FFFAFAFDAA
00A8F300F4000005F9550354000002FE000073FD77F75508575557DD55555FFF
F5FD550050F300F400000AF9AA03AC0003CEFE00045DDC1D1DDDF4AA05FFEAAA
AFFFEAFDAA00A0F300F4000005F95503540007FCFE00047774161777F455057F
F55557FFD5FD550040F300F400000AF9AA03AC000788FE0004DDDC1C1DDDF6AA
06FFAABFFAAAAFFEFCAA00A8F300F4000005F9550354000F80FE000477771737
77F65506755FFFFD5557F5FC550054F300F4000002F9AA02AC0118FD00001DFE
DD00DAF6AA06BFFAAAFEAAAFFAFBAAF300F4000005F955025400FCFD000017FE
770075F655065755555F555FF5FC550054F300F4000002F9AA00ACFD00020580
03FEDD00EAF3AA04AFAABFEAABFCAAF300F4000005F9550054FD0002074003FE
77F2550457D55FD557FC55F300F400000AF8AAFD00021DC006FEDD00EAF3AA02
AFAABFFAAAF300F4000015F9550056FD0002377005FE77F2550457D55FD557FC
5502000150F600F400002AF8AAFD00025DD806FEDDF2AA04ABEABFEAAEFCAA02
002AAAF600F400F8550057FD000277740DFE77F2550457D55FF55DFC55020055
55F600F400F8AA00ABFE000301DDDC0AFEDDF2AA04ABEABFEABAFCAA0302AAAA
80F700F5000001F755FE00060377770D577777F2550457D55FF575FD5504D415
555540F700F4000002F8AA0980000005DDDD9ABDDDDEF2AA04ABEAAFFAEAFDAA
00A8FEAA0080F700F50002055005F9550980000007777755577775F4550B5D55
57F75FFDD5755D5555D5FE550040F700F5000402AAA00000FCAA00A0FE00061D
DDDDDABDDDDAFCAA00A8FD000C02AAAAAEAAABFFAFFFEAAAAEABFCAA00A0F700
F5000005FD55FC00011560FE0005777775577775FD5502500575FE5512500015
575555FFD7FF55755D5755D55FF55540F700F500000AF7AA07A000005D80DDDE
B8FB000202AADAFCAA10802BAAFFFFEBFFAAAAAEAEAABFFFAAAAA0F700F50000
05F7550950000077770000077775FB550075FB550F40D5F55FFFFF57755D5D57
F7F5555540F700F500000AF7AA02A80001FDDD02BDDDDAFCAA01ABDCFAAA0E7F
0001FFFF000004141FFC6000AAA0F700F5000005F755025C0003FD7702577775
FE550375555577FA550E5D5555FFFFD77FF77D7FDDF5550140F700F500000AF7
AA02AE0005FDDD09FDDDDAABAAAADAAAABDDF7AA0AFFFFABAABEFEBFEABAAAA8
F600F5000005F75502570007FB77017557FE7502555777F7550B57FFD7757FD5
7FD55F555540F700F5000002F6AA01800DFBDD01DAA9FEDA03AAA9DDEAFEAA00
EAFCAA0BABFFAAAABEAAEEAAAEAAAA80F700F5000001F655016017FB77017557
FE750355577775F75505FFD7557D75DDFD55F600F400F6AA01B01DFBDD08DAAD
DBDADAAABDDDDAFEAA00EAFBAA06FFAAAAAEEBBAFAFEAAF600F400F655005CFA
77017557FE750355577775FE550075FB55097FD7D57D57D7F5555550F600F300
F7AA00ABFADD08DAADDDD9DAAABDDDDAFEAA00BAFBAA09BFEAAAAEFFAAEAAAAA
A0F600F300F655FA7708755777777555774375F755085FF7D55DFF55D55555F5
00F300F7AA00A9FADD0ADAADDDDDDAAA9D85DEAAEAFDAA09ABAAABFAAFEBAABE
FAABFEAAF500F300F7550057FA770C7557777775557743775575555DFE550BD5
55F55FF7D55DF557555550F500F300002AF8AA00ADFADD0DDAA9DBDDCAABDD85
DDAABAAAAFFAFDAA09BFAFFBAABFEABAAAAAA0F500F3000015F8550057FA770F
7555777775577743775D7D557FFF5575FE5507D7DF555FF7F55555F400F30000
02F8AA04BDDDC1D001FEDD1ACAABC9DDDCA9DD85DDAFEEABFFFFEAAAEAAFEAFF
FEAAABFEFAAAA8F400F200F855047777417001F577115557DFFFFFF575757F5F
FFFF5577FFD55540F400F200002AF9AA049DDDC1D001F5DD11EAABFFFFAFFAAA
AEAAAAFFFFAAFFBAAAAA80F400F200FE5500D5FC55045777417001F577107555
7FFF55FF5557D5557FFFD5FFF557D4F300F200022AAAABFBAA04ADDDC1D001F5
DD10DAAABFFEBEBFBAAEEAAABFFFFAFFAAAAA0F300F20003555D55D5FC550457
77417001FC770057FB770875557FF5D5FFFF55FDFCFF0257FF80F300F200052A
AFABAA0000FDAA03DDC1D001F5DD07CAAAFFEAAAAFFAEAFCFF02FAAAA9F200F1
0005030100555401FE55F177075555FDF55557FF57FCFF03F5555550F300F200
020AABABFEAA03A8DAAAAAF1DD05AAABFAEAAAABFAFF03EAAAAAA8F300F20003
1555D7D5FE5502355755F177105557F5D5557F7FFFFFD57FFFFFD5555554F300
F200020BAABBFEAA03ADCBCDAAF1DD04AAAFEAEAABFEFF04EAAAAFFFFFFDAAF3
00F2000A55D5DDD555555770775007F3770E76000F05D57F5555FFD5555FFFFF
D5FE55F300F2000CABABAFAEAAAAADDD8002D0001DF8DD108001DDC1AAAFA06A
BFAAAABFAAAAAFFFFEFDAA0080F400F3000F055555D7D5555557777755777740
0000FB77114077740037555F55D00155555F55555FFFFDFD55F300F3000A0AAA
ABAABAAAAAADDDDDEAFCDD001DFDDD01DC1DFDDD0CAABEAAE2A8000ABEAAAEAF
FFEAFDAA0080F400F3000A155577D5F5555557777755FC770060FD000001FD77
0DF755FD55D555D5407D57D757FFF5FD55F300F30007AAAAABABEAAAAAADEFDD
0DFFFFFAEBEAAAEAAABE02BFAFFFEAFDAA02800AA0F600F400080155555F57D5
555557EF770EFFFFFD7FD5557555FD5007D7FFD554FD000101F0F600F4000402
AAAAABABFEAA00ADEFDD14FDABFEAFAAAABEABFAAAA3FFFFE002AAAABFFFFDDE
F600F400041555555F57FE550057EE770F57FF5F55555F57F75555FFFFD55555
5FFDFFF600F400042AAAAAAEAEFEAA00ADEEDD0FA7FFAEAAAAABAFEBAAAAFFFF
EAAAABF7FD770080F700F50005015555575F5DFE550057F277007FFE77007FFD
5509FFFFD755557FFFF5557FFCFF00C0F700F5000502AAAAABAEBEFEAA00ADF2
DD0ADFDDDDDFFEABAAAAABFFFFFEAA03BFFFEAABFBDD00E0F700F50005055555
57557DFE550057F17710F7777FFD55DD5557FFFF57555FDFFFF57FFBFF00F0F7
00F500092AAAAAABAEFAAEAAAAA9F1DD03FFFDFDFAFEAA02BFFFFEFEAA03FFFF
EBF7FB770078F700F500FD5502D7F55DFE55F177097FFFFFF555D57FD5D55DFE
550057F8FF00FCF700F500FEAA06ABAFEABAAFEAAAF1DD09DFFFFFAAAABAAABE
AAFAFEAA02ABFFFDFADD00DCF700F6000001FD5506D7D575FD755555F277097F
777F5555F55FFD55F5FE550057F8FF00FEF700F500FEAA03ABAFFFBFFDAAF2DD
02FDDDDDFDAA04EAABAAAAABFEFF00F7FA770076F700F6000001FD5502DFFFD5
FD55F27702F77777FE550457D5575557F5FF00FEF700F6000002FEAA01ABBFFB
AAF3DD03DFDDDDFDFEAA09FEAAAEAABDDDDDDFFFFDF9DDF700F6000005FE5501
577FFB5500F7F47700F7FE7706555557D555555FF3FFF700F6000002FEAA01AF
BEFCAA01AB9DF1DD00FDFCAA01ABF7FD7701FFF7F977F700F6000005FE550157
7DFB5500F7F077FC55F2FF00FEF700F6000002FEAA01AEFEFCAA01AB9DF2DD02
DFDDEAFEAA00BFFCDD02DFFFFDFADD00DCF700F5000455555057FDFB5500F7F0
77FD55F1FF00FCF700F600050A80000A01FAFCAA01AB9DF0DD03EAAAAAAFFA77
01FFF7FA770078F700F6000557D5555557F9FB5500F7F077FE55F0FF00F0F700
F7000703FFFFFAAAABF80AFDAA00ABEFDD02EAAAAFFADD02DFFFFDFADD00E0F7
00F7000017FEFF055557FD400550FE0000F7F0770255557FF0FF00C0F700F700
003FFEFF09AAABFAAAA002AAAAAB01F0DD02AAABF7F97701FFF7FB770076F600
F700007FFEFF02D557FDFB5501D437F7770075FB00007FF0FF00FCF600F700FD
FF02EAABFAFCAA02ABFDC0FC00FCDD01C05DFEDD02DAAB80FE00071DDDDFFFFF
DFFFFDFEDD00D0F300F700FDFF02FD57FDFC550157F7FB77FC000017FD770175
5FFDFF01C07FFBFF06F000000FFFFFC0F600F700FDFF02FEAFFAFCAA01AFFDF4
DD04FFFDDDDFF7FC770200007FFDFF0007FD770074F500F700FCFF017FFFFC55
015FF7F577007FEBFF00F8F500F700FAFF00EAFDAA01BFFDF6DD00DFF6DD02DF
DDDDFDFFFEDD02FDDDD0F500F700FAFF00FDFD55007FF577E9FF00E0F500F700
F9FF04FAAAAAAEBDF6DD00DFF47702F7777FFEFF05F7777FF77780F500F700F8
FF03D5557FFFF677007FE9FFF400F700F8FF00FEFEFFF7DD00DFF4DD03DFDDDD
DFFBFF04FDD00001FAF700F700F7FF04DFFFFD7FF7F977E8FF03E00007FFF700
F700F5FF02FEFFFFFADD00FFF377037FF7777FFBFF04F700007FFFF700F700F4
FF037FFFFFF7FE7701577FE8FF04FE0FF5FFFFF700F70002FFFFA3F3FF04DFFF
DDFFFDF4DD04DFDDDFDFDDFAFF01F07FFEFFF700F70002FFFF07D5FF00C7FDFF
F700F70002FFFE03F1FF00F7F777007FFD77057FF7FF7FFF7FFBFF00E7FDFFF7
00F70002FC0007D0FFF700F70002F00003F1FF00FDF7DD09DFFFDDDFDDFFFFDF
FFFDFBFF01FDDFFDFFF700F70002600001D0FFF700F5000003F0FF00F7F77703
FFF77FF7F0FFF700F5000201FFFDD2FFF700F400F4FFFADD00DFFDFF04DFDDDD
FFFDFBFF00DFF5FFF700F400007FD1FFF700F400000BFAFF03F7FFFFF7F57703
7FFFF77FECFFF700F300001FFAFF00DFDAFFF700F200000FF9FFF4DDE9FF00FE
F700F2000007D4FF00F8F700F2000003F9FF00F7F67701F77FF3FF010007FAFF
00E0F700EF00030FFD557FFAFFFE000007FBFF00FCFA00FDFF04E0FFF80007FC
FF0080F700F0000BFFF00AAFDDDDDFFDDDDDC000FEDD07D800007FFFFFFE03FA
FF0007FEFF009FFEFF05F8007FFFFFF8F600F000021FF550FA00001FFAFF0380
000001F9FF04F83FFFC07FFCFF03807FFFC0F600F000032AAAAAB7F57703FFF7
7F7FF6FF02C3FC3FFAFF01BFFEF500F1000001FE55007FE6FF01FC03F9FF01DF
FFF500F100000AFEAAF4DDE8FF00E0F400F100FD55D9FF00E0F600F200FDAA03
AF77FAF7F877007FE6FF00F0F600F3000005FD55035FFF555FDCFF00F0F600F3
00000AFDAA03AFFAAAABF9DD02DEAAAFE7FF00F8F600F3000015F955F9FF02FD
5555E7FF00F8F600F300002AF9AA00B7FD77057FFFFFEAAAAAE7FF00F8F600F3
00F855005FFDFF00D5FC55007FE8FF00F8F600F300EFAA00ABE6FF00F8F600F4
000001EF55005FE6FF00F8F600F4000002EFAA00BFE6FF00F8F600F4000001EF
55007FE6FF00F8F600F4000002EFAAE5FF00F0F600F4000001EF55E5FF00F0F6
00F4000002EFAAE5FF00E0F600F4000005EF55E5FF00C0F600F4000002F0AA00
ABE5FF0080F600F4000005F4550457FFD55555E5FFF500F4000002F7AA07FFFA
AAAFFFFAAAABE6FF00FCF500F4000005F955005FFBFF01FD57E6FF00FEF400F4
000002FBAA00ABF8FF00BFE6FF00FCF400F4000005FB550157DFDDFF00F0F400
F40005A002BFFFFEBFDAFF00F8F400F500030555F81FD7FF00FCF400F500030A
BFFFE0D7FF00FEF400F500005FFEFF0000D7FFF400F500FCFF0003D8FFF400F6
000001FCFF01FC0FD9FFF400F6000003FBFF03F000007FDCFF0080F500F60000
07F8FF02800001DEFFF400F6000003F6FF01FE0FDFFF0080F500F6000007F5FF
02F03FE0FB00001FE8FFF400F600000FF4FF01C01FFBFF01E00FEAFF01FE80F5
00F6000007EBFF01F000FDFF01FC00F0FFF400F600000FE9FF0007FEFF0183FF
FA00000FF9FF00FEF400F6000007E9FF00F8FE00007FF9FF02F0003FFDFF02E0
0FFCF400F600000FDAFF06C01FFFE0001FF0F300F6000007D9FF02E0001FFEFF
00F0F400F6000003FDFF030BFFFF01DBFF00E0F400F6000801FFFFF000017F80
03DBFF0080F400F50001FFFEFC000007DBFF0080F400F500007FFB000007DBFF
F300EE00000FDBFFF300EE00000FDBFFF300EE00000FDBFF0080F400EE00001F
DBFF00C0F400EE00000FDBFF00E0F400EE00001FDBFF00F0F400EE00000FDBFF
00F8F400EE00001FFEFF05FC1FFFFFF87FE4FF00F8F400EE00000FFEFF05E00F
FFFFF03FE4FF00F8F400EE000907FFFFFC0003FFFFE03FE4FF00F8F400EE0002
0BFFFFFD00027F801FE4FF00F8F400EE000205FFFCFB00001FEBFF01FC17FCFF
00F8F400EE000202FFF0FB00001FECFF02FE000BFCFF00F8F400F6000101F0FA
00017F80FB00001FF9FF01C003FCFF00FCFCFF04F000017F0FFEFF00F8F400F6
00010310F200000FFAFF02800003FCFF0280FFFCE800F600010210F200000FFD
FF00C0FD000001FDFF06E0000003FFFFF4FD000001FEFF00F8F400F60001047F
F200000FFEFF03FC3FFFC0F800007FFEFF00A0FC00FEFF00F0F400F600010413
F2000004FE000203FFFEFD00063FFFFFC000007FFEFFFB00035FFFFFF0F400F6
00010416F2000003FCFF00F0FD000202AA80FE00033FFFFFF8FB00032FFFFFE0
F400F60001043CF2000007FCFF00C0F700031FFFFFE0FB000301FFFFC0F400F6
00010678F2000003FDFF00FEF600030FFFFFC0FA00021FFF80F400F6000203FF
CCF3000003FDFF00F8F6000207FFFFF900010FFFF300F5000101CCF3000001FE
FF00F0F5000203FFE0F9000103FCF300E40002FFFFD0F3000055E800E400017F
FED800E400011FF0D800E400010A80D800B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900B900B900B900B900B900B900B900B900B900B900B900B900B9
00B900B900B900FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFF000138360040779E00013A06000A000137A20001
4452565200401074000033670001385B0000A000004012620000303A00402000
0040DC420000A000004012620001FFFE00001000000137F40002000000110040
3D94000010E2000137F400404E260000000400401074000014230001385B0000
10E2000000110000122200403EFC000019CC004020040040394E0001FFFE0000
100000000001000200040000FFD0004012620001A1A200005F240001A1800001
38260040390C000137F400401074000137F40001A15800000000000000000000
A470000020140000AC8C000000000005A00000403F120000000000000001385A
FFFE009800000000000000002000000020000000000000000001000200040000
SHAR_EOF

-----
-- 
				Henry Spencer @ U of Toronto Zoology
				{allegra,ihnp4,linus,decvax}!utzoo!henry

henry@utzoo.UUCP (Henry Spencer) (12/19/84)

A small but important addendum from my friend:

-----

From uucp Tue Dec 18 16:55:32 1984
>From oz  Tue Dec 18 15:55:10 1984 remote from yetti
Received: by yetti.UUCP (4.12/4.7)
	id AA00312; Tue, 18 Dec 84 15:55:10 est
Date: Tue, 18 Dec 84 15:55:10 est
From: yetti!oz (Ozan Yigit)
Message-Id: <8412182055.AA00312@yetti.UUCP>
To: utzoo!henry
Subject: Big boo-boo in the macrst.c (I sent yesterday)


The constant NSCAN should be 20.. I do not know how it become 18 !!
Please post this correction to net.sources.. thnx..

Oz

-----
-- 
				Henry Spencer @ U of Toronto Zoology
				{allegra,ihnp4,linus,decvax}!utzoo!henry