Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!uunet!seismo!rutgers!ames!amdahl!drivax!holloway From: holloway@drivax.UUCP (Bruce Holloway) Newsgroups: comp.sys.atari.st,comp.sys.amiga Subject: Convert Amiga IFF files to Atari ST DEGAS files Message-ID: <2275@drivax.UUCP> Date: Thu, 27-Aug-87 14:16:17 EDT Article-I.D.: drivax.2275 Posted: Thu Aug 27 14:16:17 1987 Date-Received: Fri, 4-Sep-87 00:43:08 EDT Reply-To: holloway@drivax.UUCP (Bruce Holloway) Organization: Compact (was DRI) Lines: 1374 Xref: mnetor comp.sys.atari.st:4969 comp.sys.amiga:7961 "iff" is a set of programs that convert images from IFF format (often used on the Amiga) to DEGAS format (mode 0). They run on UNIX !ONLY! I'm working on a version that will work on the ST, but there are some rather large problems (usually 1.9-7.6(!) megs of disk space needed for the intermediate file, and the associated high disk I/O cost make this particularly tedious - but it wouldn't fit in memory...) As near as I can tell, this can convert all Amiga pictures, including HAM pictures and high-resolution pictures. At a cost to detail and color, but in most cases it's difficult to tell unless you've seen the same image on an Amiga. #-------------------------------------------------------------------------- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # iff.doc # Makefile # iff.c # make320x200.c # pick16.c # beach.uue # This archive created: Thu Aug 27 10:12:58 1987 # By: Bruce Holloway (Compact (was DRI)) export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'iff.doc'" '(3387 characters)' if test -f 'iff.doc' then echo shar: "will not over-write existing file 'iff.doc'" else sed 's/^ X//' << \SHAR_EOF > 'iff.doc' XIntro: X X "iff" is a set of programs that convert images from IFF format (often X used on the Amiga) to DEGAS format (mode 0). They run on UNIX !ONLY! X I'm working on a version that will work on the ST, but there are some X rather large problems (usually 1.9-7.6(!) megs of disk space needed X for the intermediate file, and the associated high disk I/O cost make X this particularly tedious - but it wouldn't fit in memory...) X X As near as I can tell, this can convert all Amiga pictures, including X HAM pictures and high-resolution pictures. At a cost to detail and X color, but in most cases it's difficult to tell unless you've seen the X same image on an Amiga. X XUsage: X X iff X X Where is an unARCed IFF file. Creates an intermediate file X named .ami which is simply a width, a height, and every X pixel in the IFF file described as three bytes, one each for Red, X Blue, and Green. X X If the image is larger than 320x200, "iff" automatically chains to X "make320x200", otherwise it chains directly to "pick16". X X make320x200 X X Shrinks an "ami" file (such as the output from "iff") to 320x200 X by averaging the colors vertically and horizontally (whatever X seems to be called for). It overwrites the original file, and X calls "pick16" automatically when done. X X pick16 X X Reads an intermediate file (as created by "iff" and "make320x200") X into memory, creates a weighted array of colors as used by the X picture, shrinks the array by combining adjacent (or nearly X adjacent) colors into one (based upon their weighting) until there X are only sixteen left, then creates a DEGAS low-resolution picture X from this info. This takes a LONG time with hundreds of colors, as X with HAM mode pictures, but only seconds with regular 32 color X pictures. X X "pick16" writes a file with the same name as the original, but X with ".pi1" as an extension (it overwrites an existing extension, X or adds it on if there isn't one to begin with). X X Use DEGAS, Picswitch, or one of the other utilities to display these X after downloading them to the ST. X XCompiling: X X These utilities should work on both Berkeley Unix systems and the AT&T X System V Unix systems. Just type "make all" to make all the utilities. X I've included a sample Amiga picture; uudecode this, unARC it, and run X it through the utility by typing "iff beach". X X You'll need to uncomment the "System V" line (and comment out the X "BSD" line) in the Makefile if you're on System V. X XBugs: X X "iff" decides that a picture is in HAM (Hold and Modify) mode if the X bit image is in six planes. This might not be the case if the picture X uses the extra "Half-Bright" plane. Few pictures do; I've never seen X any that do. If I find one, I'll change "iff" so that it can handle X them. X X Color Cycling is not supported, and probably won't be. But few IFF X readers for the Amiga support it, either... X X X- Bruce X XBruce Holloway - Terminal Netnews Addict {seismo,sun}!amdahl!drivax!holloway SHAR_EOF if test 3387 -ne "`wc -c < 'iff.doc'`" then echo shar: "error transmitting 'iff.doc'" '(should have been 3387 characters)' fi fi echo shar: "extracting 'Makefile'" '(372 characters)' if test -f 'Makefile' then echo shar: "will not over-write existing file 'Makefile'" else sed 's/^ X//' << \SHAR_EOF > 'Makefile' X# Makefile for "iff" et.al. X X# Uncomment the next line if you're on a BSD system. X XCFLAGS = -O -DBSD X X# Uncomment the next line if you're on a System V system. X X#CFLAGS = -O -DSYSV X Xall: iff make320x200 pick16 X Xiff: iff.c X cc -o iff $(CFLAGS) iff.c X Xmake320x200: make320x200.c X cc -o make320x200 $(CFLAGS) make320x200.c X Xpick16: pick16.c X cc -o pick16 $(CFLAGS) pick16.c X SHAR_EOF if test 372 -ne "`wc -c < 'Makefile'`" then echo shar: "error transmitting 'Makefile'" '(should have been 372 characters)' fi fi echo shar: "extracting 'iff.c'" '(9687 characters)' if test -f 'iff.c' then echo shar: "will not over-write existing file 'iff.c'" else sed 's/^ X//' << \SHAR_EOF > 'iff.c' X/* program reads IFF files, and prints out relevant stats. */ X X#include X X#ifdef BSD X#include X#endif X X#ifdef SYSV X#include X#endif X X#define SWAPW(w) w = (((w) >> 8) & 0xFF) | ((w) << 8) X#define SWAPL(l) l = ((l>>24)&0xFF)|((l>>16)&0xFF)|((l>>8)&0xFF)|(l&0xFF) X Xextern char *malloc(); X Xtypedef unsigned long ID; X Xtypedef unsigned short UWORD; Xtypedef unsigned char UBYTE; Xtypedef short WORD; Xtypedef char BYTE; Xtypedef unsigned long ULONG; Xtypedef long LONG; X X#define MAKEID(a,b,c,d) ((a<<24) | (b<<16) | (c<<8) | d) X X#define ID_ILBM MAKEID('I','L','B','M') X#define ID_BMHD MAKEID('B','M','H','D') X#define ID_CMAP MAKEID('C','M','A','P') X#define ID_GRAB MAKEID('G','R','A','B') X#define ID_DEST MAKEID('D','E','S','T') X#define ID_SPRT MAKEID('S','P','R','T') X#define ID_CAMG MAKEID('C','A','M','G') X#define ID_BODY MAKEID('B','O','D','Y') X#define ID_CRNG MAKEID('C','R','N','G') X X#define FORM MAKEID('F','O','R','M') X#define PROP MAKEID('P','R','O','P') X#define LIST MAKEID('L','I','S','T') X#define CAT MAKEID('C','A','T',' ') X#define FILLER MAKEID(' ',' ',' ',' ') X Xtypedef struct { /* Group Header */ X ID ckid; X LONG cksize; X ID grpsubid; X } GroupHeader; X Xtypedef struct { X ID ckid; X LONG cksize; X } ChunkHeader; X Xtypedef struct { X ID ckid; X LONG cksize; X UBYTE ckdata[1]; X } Chunk; X Xtypedef struct { /* BMHD */ X ID id; X LONG len; X UWORD w, h; X WORD x, y; X UBYTE nplanes; X UBYTE masking; X UBYTE compression; X UBYTE pad1; X UWORD transparentcolor; X UBYTE xaspect, yaspect; X WORD pagewidth, pageheight; X } BitMapHeader; X Xtypedef struct { /* CAMG */ X ID id; X LONG len; X LONG mode; X } ViewPortMode; X Xtypedef struct { /* CMAP */ X ID id; X LONG len; X UBYTE colors[1]; X } ColorRegister; X Xtypedef struct { /* DEST */ X ID id; X LONG len; X UBYTE depth; X UBYTE pad1; X UWORD planepick; X UWORD planeonoff; X UWORD planemask; X } DestMerge; X Xtypedef struct { /* CNRG */ X ID id; X LONG len; X WORD pad1; X WORD rate; X WORD active; X UBYTE low, high; X } CRange; X XBitMapHeader *bmhd; XViewPortMode *camg; XColorRegister *cmap; XDestMerge *dest; XCRange *crng; XChunk *body; X XChunk *GetChunk(); X Xmain(acnt,avar) Xint acnt; Xchar *avar[]; X{ X if(acnt != 2){ X fprintf(stderr,"usage: readout file\n"); X return; X } X readout(avar[1]); X} X Xreadout(fname) Xchar *fname; X{ X char ofname[128]; X Chunk *chunk; X GroupHeader gh; X ChunkHeader ch; X int fd, ofd; X long size; X X bmhd = 0; X cmap = 0; X body = 0; X dest = 0; X crng = 0; X camg = 0; X X fprintf(stderr,"\nReading file \"%s\".\n",fname); X fd = open(fname,O_RDONLY,0666); X if(fd < 0){ X fprintf(stderr,"Couldn't open \"%s\".\n",fname); X return; X } X GetGroupHeader(fd,&gh); X PrintGroupHeader(&gh); X size = gh.cksize - sizeof(ID); X while(size > 0){ X chunk = GetChunk(fd); X size -= chunk->cksize + sizeof(ChunkHeader); X fprintf(stderr,"Chunk is type "); PrintID(chunk->ckid); fprintf(stderr,"\n"); X X if(chunk->ckid == ID_BMHD){ X bmhd = (BitMapHeader *)chunk; X fixBMHD(); X PrintBMHD(); X } X else if(chunk->ckid == ID_CAMG){ X camg = (ViewPortMode *)chunk; X SWAPL(camg->mode); X PrintCAMG(); X } X else if(chunk->ckid == ID_CMAP){ X cmap = (ColorRegister *)chunk; X PrintCMAP(); X } X else if(chunk->ckid == ID_DEST){ X dest = (DestMerge *)chunk; X PrintDEST(); X } X else if(chunk->ckid == ID_CRNG){ X crng = (CRange *)chunk; X fixCRNG(); X PrintCRNG(); X } X else if(chunk->ckid == ID_BODY){ X body = chunk; X strcpy(ofname,fname); X strcat(ofname,".ami"); X ofd = open(ofname,O_WRONLY+O_CREAT,0666); X if(ofd < 0){ X fprintf(stderr,"Couldn't open \"%s\" for output.\n",ofname); X } X else{ X PrintBODY(ofd); X close(ofd); X if((bmhd->w != 320) || (bmhd->h != 200)){ X fprintf(stderr,"Calling make320x200.\n"); X execl("make320x200","make320x200",ofname,(char *)0); X } X else{ X fprintf(stderr,"Calling pick16.\n"); X execl("pick16","pick16",ofname,(char *)0); X } X } X } X else{ X fprintf(stderr,"*** Unhandled Chunk \""); X PrintID(chunk->ckid); X fprintf(stderr,"\" - %ld bytes. ***\n",chunk->cksize); X } X if(chunk->ckid == ID_BODY) break; X } X close(fd); X} X XPrintCAMG(){ X fprintf(stderr,"\tViewPortMode = %08lx\n",camg->mode); X} X XfixBMHD(){ X SWAPW(bmhd->w); X SWAPW(bmhd->h); X SWAPW(bmhd->x); X SWAPW(bmhd->y); X SWAPW(bmhd->transparentcolor); X SWAPW(bmhd->pagewidth); X SWAPW(bmhd->pageheight); X} X Xchar *masktype[] = { X "No Masking", X "Has Mask", X "Has Transparent Color", X "Lasso", X "Unknown" X }; X Xchar *comptype[] = { X "No Compression", X "Byte Run 1", X "Unknown" X }; X XPrintBMHD(){ X fprintf(stderr,"\tWidth and Height = (%d,%d)\n",bmhd->w,bmhd->h); X fprintf(stderr,"\tX and Y of Upper Left Corner = (%d,%d)\n",bmhd->x,bmhd->y); X fprintf(stderr,"\tNumber of Planes = %d\n",bmhd->nplanes); X fprintf(stderr,"\tMasking = %s\n",masktype[bmhd->masking]); X fprintf(stderr,"\tCompression = %s\n",comptype[bmhd->compression]); X fprintf(stderr,"\tTransparent Color = %d\n",bmhd->transparentcolor); X fprintf(stderr,"\tX and Y aspects = (%d,%d)\n",bmhd->xaspect,bmhd->yaspect); X fprintf(stderr,"\tPage width and height = (%d,%d)\n",bmhd->pagewidth,bmhd->pageheight); X} X XPrintCMAP(){ X int ncolors; X int i; X X ncolors = cmap->len / 3; X fprintf(stderr,"\t%d colors.\n",ncolors); X for(i=0; icolors[3*i],cmap->colors[3*i+1],cmap->colors[3*i+2]); X } X} X XPrintDEST(){} X XfixCRNG(){ X SWAPW(crng->rate); X SWAPW(crng->active); X} X XPrintCRNG(){ X fprintf(stderr,"\t%sCycle %d to %d, rate=%d steps/second.\n", X (crng->active)?"":"Don't ", X crng->low,crng->high, X (crng->rate * 60)/16384); X} X XGetGroupHeader(fd,gh) Xint fd; XGroupHeader *gh; X{ X GetID(fd,&(gh->ckid)); X GetLong(fd,&(gh->cksize)); X GetID(fd,&(gh->grpsubid)); X} X XPrintGroupHeader(gh) XGroupHeader *gh; X{ X if(gh->ckid == LIST) fprintf(stderr,"List of "); X if(gh->ckid == PROP) fprintf(stderr,"Properties associated with "); X if(gh->ckid == LIST || gh->ckid == FORM || gh->ckid == PROP) X fprintf(stderr,"Form type "); X else if(gh->ckid == CAT) fprintf(stderr,"Concatenation of "); X else{ X PrintID(gh->ckid); X fprintf(stderr," of "); X } X PrintID(gh->grpsubid); X fprintf(stderr," (%ld bytes)\n",gh->cksize); X} X X#define MBUFSIZ 32767 X Xint initted = 0; Xchar *ibuf; Xint buflen; X Xxwrite(fd,buf,siz) Xint fd, siz; Xchar *buf; X{ X if(!initted){ X ibuf = malloc(MBUFSIZ); X if(!ibuf){ X fprintf(stderr,"Couldn't allocate output buffer.\n"); X exit(3); X } X buflen = 0; X initted = 1; X } X while(siz--){ X *(ibuf+buflen++) = *buf++; X if(buflen == MBUFSIZ) xflush(fd); X } X} X Xxflush(fd) Xint fd; X{ X if(!initted) return; X write(fd,ibuf,buflen); X buflen = 0; X} X XPrintBODY(fd) Xint fd; X{ X register int k, i, j; X register unsigned char com; X register unsigned bm, nplanes; X int x, y, rowoff, coloff; X int ax, ay, ham; X char *ts1, *ts2, ts3; X long len, plsize; X unsigned char *planes[6], *mplane; X long rowsize; X struct { char r, g, b; } color; X X if(!bmhd || !body) return; X x = bmhd->w; y = bmhd->h; X X nplanes = bmhd->nplanes; X ham = (nplanes == 6); X X rowsize = x/8; X plsize = (x * y)/8; X X if(!(mplane = (unsigned char *)malloc(nplanes * plsize))){ X fprintf(stderr,"No memory for plane image.\n"); X return; X } X X for(i=0; i<6; ++i) planes[i] = mplane + i*rowsize; X X xwrite(fd,&x,sizeof(int)); X xwrite(fd,&y,sizeof(int)); X X ts2 = (char *)mplane; X ts1 = (char *)(body->ckdata); X len = body->cksize; X X if(bmhd->compression) while(len-- > 0){ X i = (int)(*ts1++); X if(i >= 0){ X ++i; X len -= i; X while(i-- > 0){ *ts2++ = *ts1++; } X } X else if(i != -128){ X i = -i + 1; X while(i--){ *ts2++ = *ts1; } X ++ts1; --len; X } X } X else while(len--){ *ts2++ = *ts1++; } X X free(body); body = (Chunk *) mplane; X X for(ay=rowoff=0; ay>= 1)){ X bm = 0x80; X ++rowoff; X } X for(com=0, k=nplanes; k--;){ X com <<= 1; X if(*(planes[k]+rowoff) & (unsigned char)bm) ++com; X } X if(ham){ X unsigned char c, *s; X X c = com & 0xF; X switch(com & 0x30){ X case 0x00: X s = &cmap->colors[c * 3]; X color.r = *s++; X color.g = *s++; X color.b = *s; X break; X case 0x20: X color.r = c << 4; X break; X case 0x30: X color.g = c << 4; X break; X case 0x10: X color.b = c << 4; X break; X } X xwrite(fd,&color,3); X } X else xwrite(fd,&cmap->colors[com * 3],3); X } X } X xflush(fd); X} X XPrintID(id) XID id; X{ X int i; X X for(i=0; i<4; ++i){ X fprintf(stderr,"%c",(id >> 24) & 0xFF); X id <<= 8; X } X} X XGetID(fd,id) Xint fd; XID *id; X{ X UBYTE temp[sizeof(ID)]; X int i; X X read(fd,temp,sizeof(ID)); X X for(i=0; ickid = ch.ckid; X c->cksize = ch.cksize; X read(fd,c->ckdata,c->cksize); X return((Chunk *)c); X} X SHAR_EOF if test 9687 -ne "`wc -c < 'iff.c'`" then echo shar: "error transmitting 'iff.c'" '(should have been 9687 characters)' fi fi echo shar: "extracting 'make320x200.c'" '(2511 characters)' if test -f 'make320x200.c' then echo shar: "will not over-write existing file 'make320x200.c'" else sed 's/^ X//' << \SHAR_EOF > 'make320x200.c' X#include X X#ifdef BSD X#include X#endif X X#ifdef SYSV X#include X#endif X X#define MAXX 320 X#define MAXY 200 X Xunsigned curx, cury; Xunsigned dubx, duby; X Xtypedef struct { X unsigned char r, g, b; X } COLOR; X Xextern char *malloc(); X XCOLOR *ipic; X Xmain(acnt,avar) Xint acnt; Xchar *avar[]; X{ X int fd; X unsigned len; X unsigned x, y, i1, i2; X unsigned tr, tg, tb, td; X X if(acnt != 2){ X fprintf(stderr,"usage: make320x200 \n"); X return; X } X X fd = open(avar[1],O_RDONLY,0666); X if(fd < 0){ X fprintf(stderr,"Couldn't open %s for reading.\n",avar[1]); X return; X } X X read(fd,&curx,(sizeof curx)); X read(fd,&cury,(sizeof cury)); X dubx = (curx == 640); X duby = (cury == 400); X X fprintf(stderr,"Current picture size is %dx%d.\n",curx,cury); X X if(dubx || duby){ X len = sizeof(COLOR) * curx * cury; X ipic = (COLOR *)malloc(len); X if(!ipic){ X fprintf(stderr,"Couldn't allocate %d bytes for temp buffer.\n",len); X return; X } X read(fd,(char *)ipic,len); X fprintf(stderr,"Picture in memory.\nWriting output.\n"); X close(fd); X unlink(avar[1]); X fd = open(avar[1],O_WRONLY+O_CREAT,0666); X if(fd < 0){ X fprintf(stderr,"Couldn't open %s for writing.\n",avar[1]); X return; X } X td = 2 * (dubx + duby); X for(y=0; yr + (ipic+i2+1)->r; X tg = (ipic+i2)->g + (ipic+i2+1)->g; X tb = (ipic+i2)->b + (ipic+i2+1)->b; X break; X case 2: /* duby */ X tr = (ipic+i2)->r + (ipic+i2+MAXX)->r; X tg = (ipic+i2)->g + (ipic+i2+MAXX)->g; X tb = (ipic+i2)->b + (ipic+i2+MAXX)->b; X break; X case 3: /* dubx & duby */ X tr = (ipic+i2)->r + (ipic+i2+1)->r; X tg = (ipic+i2)->g + (ipic+i2+1)->g; X tb = (ipic+i2)->b + (ipic+i2+1)->b; X tr += (ipic+i2+curx)->r + (ipic+i2+curx+1)->r; X tg += (ipic+i2+curx)->g + (ipic+i2+curx+1)->g; X tb += (ipic+i2+curx)->b + (ipic+i2+curx+1)->b; X break; X } X (ipic+i1)->r = tr/td; X (ipic+i1)->g = tg/td; X (ipic+i1)->b = tb/td; X } X } X len = sizeof(COLOR) * MAXX * MAXY; X fprintf(stderr,"Writing out screen\n"); X curx = MAXX; cury = MAXY; X write(fd,&curx,(sizeof curx)); X write(fd,&cury,(sizeof cury)); X write(fd,(char *)ipic,len); X close(fd); X fprintf(stderr,"Done.\n"); X fprintf(stderr,"Calling pick16.\n"); X execl("pick16","pick16",avar[1],(char *)0); X } X} SHAR_EOF if test 2511 -ne "`wc -c < 'make320x200.c'`" then echo shar: "error transmitting 'make320x200.c'" '(should have been 2511 characters)' fi fi echo shar: "extracting 'pick16.c'" '(5076 characters)' if test -f 'pick16.c' then echo shar: "will not over-write existing file 'pick16.c'" else sed 's/^ X//' << \SHAR_EOF > 'pick16.c' X#include X X#ifdef BSD X#include X#endif X X#ifdef SYSV X#include X#define rindex strrchr X#endif X Xextern char *rindex(); Xextern char *calloc(); X Xchar *s; Xchar fname[128]; X Xunsigned char xscreen[32000]; Xunsigned screen[16000]; Xunsigned entry[512]; Xint indirect[512], inx; Xunsigned palette[16]; X Xunsigned numentries = 0; Xunsigned xmax, ymax; Xunsigned r, g, b, r1, g1, b1, r2, g2, b2, w1, w2, w, w12; Xstruct points { unsigned char br, bg, bb; } color; X Xstruct points *pp; X Xint dist, dist2; Xint dr1, dg1, db1, dr2, dg2, db2; Xunsigned besti, bestj, tr; X Xint fd; X Xmain(acnt,avar) Xint acnt; Xchar *avar[]; X{ X int i, j; X struct points *tpp; X X if(acnt < 1) return(1); X strcpy(fname,avar[1]); X fd = open(fname,O_RDONLY,0666); X if(fd < 0){ X fprintf(stderr,"Couldn't open \"%s\" for reading.\n",fname); X return(2); X } X X fprintf(stderr,"Clearing entry[]\n"); X for(i=0; i<512;) entry[i++] = 0; X read(fd,&xmax,sizeof(unsigned)); X read(fd,&ymax,sizeof(unsigned)); X X if(ymax > 200) ymax = 200; X X fprintf(stderr,"xmax=%u ymax=%u\n",xmax,ymax); X X pp = (struct points *)calloc(xmax*ymax,sizeof(struct points)); X if(!pp){ X fprintf(stderr,"Couldn't allocate screen.\n"); X return(5); X } X read(fd,pp,xmax*ymax*sizeof(struct points)); X close(fd); X X tpp = pp; X X for(i=0; ibr; g = tpp->bg; b = tpp->bb; X/* X read(fd,&color,(sizeof color)); X r = color.br; g = color.bg; b = color.bb; X*/ X#ifdef DEBUG X fprintf(stderr,"r=%u g=%u b=%u\n",r,g,b); X#endif X r = (r+16)/32; X g = (g+16)/32; X b = (b+16)/32; X if(r > 7) r = 7; X if(g > 7) g = 7; X if(b > 7) b = 7; X r = 64*r + 8*g + b; X if(!entry[r]) ++numentries; X ++entry[r]; X }} X fprintf(stderr,"\n"); X fprintf(stderr,"%u color entries.\n",numentries); X while(numentries > 16){ X#ifdef DEBUG X fprintf(stderr,"%u color entries.\n",numentries); X#endif X dist = 9999; X for(i=1; i<512; ++i){ X if(!entry[i]) continue; X dr1 = (i/64); X dg1 = ((i/8) & 7); X db1 = (i & 7); X for(j=1; j<512; ++j){ X if(!entry[j] || i == j) continue; X dr2 = (j/64) - dr1; X dg2 = ((j/8) & 7) - dg1; X db2 = (j & 7) - db1; X dist2 = (dr2*dr2 + dg2*dg2 + db2*db2); X if(dist2 < dist){ X besti = i; X bestj = j; X dist = dist2; X } X } X } X w1 = entry[besti]; X w2 = entry[bestj]; X w = w1+w2; w12 = w/2; X r1 = besti/64 * w1; r2 = bestj/64 * w2; X g1 = ((besti/8) & 7) * w1; g2 = ((bestj/8) & 7) * w2; X b1 = (besti & 7) * w1; b2 = (bestj & 7) * w2; X entry[besti] = entry[bestj] = 0; X numentries -= 2; X r = (r1+r2+w12)/w; X g = (g1+g2+w12)/w; X b = (b1+b2+w12)/w; X i = r*64 + g*8 + b; X if(!entry[i]) ++numentries; X entry[i] += w; X indirect[besti] = indirect[bestj] = i; X } X for(i=inx=0; i<512; ++i){ X if(entry[i]){ X r = i/64; X g = (i/8) & 7; X b = i & 7; X indirect[i] = -(inx+1); X palette[inx] = r * 256 + g * 16 + b; X fprintf(stderr,"%d%d%d ",r,g,b); X ++inx; X } X } X while(numentries++ < 16){ X fprintf(stderr,"777 "); X palette[inx++] = 0x777; X } X fprintf(stderr,"\n"); X fprintf(stderr,"Clearing screen\n"); X for(i=0; i<16384; ) screen[i++] = 0; X X fprintf(stderr,"Making picture.\n"); X X tpp = pp; X X for(j=0; jbr; g = tpp->bg; b = tpp->bb; X/* X read(fd,&color,(sizeof color)); X r = color.br; g = color.bg; b = color.bb; X*/ X#ifdef DEBUG X fprintf(stderr,"r=%u g=%u b=%u\n",r,g,b); X#endif X r = (r+16)/32; X g = (g+16)/32; X b = (b+16)/32; X if(r > 7) r = 7; X if(g > 7) g = 7; X if(b > 7) b = 7; X inx = 64*r + 8*g + b; X X while(indirect[inx] >= 0){ X if(indirect[inx] == inx){ X fprintf(stderr,"Indirection error!\n"); X return(4); X } X inx = indirect[inx]; X } X inx = -indirect[inx] - 1; X pixel(i,j,inx); X }} X fprintf(stderr,"\n"); X X fprintf(stderr,"Writing screen.\n"); X X s = rindex(fname,'.'); X if(!s) s = fname + strlen(fname); X strcpy(s,".pi1"); X X fd = open(fname,O_WRONLY+O_CREAT,0666); X if(fd < 0){ X fprintf(stderr,"Whoops - couldn't open \"%s\".\n",fname); X return(3); X } X X outword(0); X for(i=0; i<16; ++i) outword(palette[i]); X convscreen(); X write(fd,xscreen,32000); X close(fd); X X fprintf(stderr,"Screen written.\n"); X X return(0); X} X Xpixel(x,y,pix) Xunsigned x, y, pix; X{ X unsigned bmask, indx, pmask, i; X X if(x > 319 || y > 199) return; X X indx = 80 * y + (x/16) * 4; X bmask = ((unsigned)0x8000 >> (x%16)); X pmask = 1; X for(i=0; i<4; ++i, ++indx){ X if(pix & pmask) screen[indx] |= bmask; X pmask <<= 1; X } X} X Xoutword(wrd) Xunsigned wrd; X{ X char tw[2]; X X tw[0] = (char)(wrd >> 8); X tw[1] = (char)wrd; X write(fd,tw,2); X} X Xconvscreen(){ X unsigned i, j, w; X X for(i=j=0; i<16000;){ X w = screen[i++]; X xscreen[j++] = (unsigned char)(w >> 8); X xscreen[j++] = (unsigned char)w; X } X} SHAR_EOF if test 5076 -ne "`wc -c < 'pick16.c'`" then echo shar: "error transmitting 'pick16.c'" '(should have been 5076 characters)' fi fi echo shar: "extracting 'beach.uue'" '(19738 characters)' if test -f 'beach.uue' then echo shar: "will not over-write existing file 'beach.uue'" else sed 's/^ X//' << \SHAR_EOF > 'beach.uue' Xbegin 644 beach.arc XM&@AB96%C: #_?QCK_W\7330 !H/(7FTYH3@$T ,[&" P"3 XM*S0 4("!%0L$%H"R &"8A0$* (BV("X"@'!1R!,B60K6 1?@QS]_!?_T^R> XM'X #_/X5> K +R##!![\!3!@W[]_ /)AYJ>OX(/!5CMSU'QO<[W \?[=*SB XMW+]LA#_\ ]8/0($ EP%7O@Q @&1PD ?P#F 9@3(MM4'[A5T0'S B'9 ?0#P XM@]\'^V$&C( #!%C0#P1FA]N$W?EU86($ ; 9126]]0 &5(6'SBB!3 8?@^4 XM" XIZDX78N$Y?(!X[,T6W#\0ACA9?/C@]P>('6IH)#[2_2#//P(> XMP.0 C5G9G7"&$>?@A5A2.!D G]WY W(AC@@B/D$:R8]T!YR)XIK3F8?>/Q&M XMF%@!$$JV7IQ^V3A ?38^H!E^!X &2&?(U?,//8'-\\]IB);G#X6.'?:H;KD9 XM)H!LP!C6F(T!Q/=I04(F)]H/EHEJE70!F"K='^842$"$;A;PFZ/_=!3 H[;J XM:.L M1V'F7, \,E/M@\$NZT\K/$GW0?)PD8 >)?Q(ZNUMJDW6WXTBG4@>E99 XMRN=]*_()C(U38O8'?P# $\^*I4GW0+J$;2688EMQ)&&"N&W7&(VV_H4O./A^ XM )J(\WF+JV73$I9MDV XMB"?!_CRE,D$]%::MR@8$()*_QP0-P8AP)"P[*#XQ-ZG1F9X>9G 3$ XMK6AZZUWLH&&J9DPDB/SF)S*O? ,@K,&L">Y9X?\(QQZ-$,+)ZKP/+"W<;+7A XMMNMA((*L+0#^9/O#8!T-O!G* 7A.&>C"B?5RC1(_V=VS41?_K<1AS;SQ5JMM.@:66 !B#088;OR"UKRF)AI67T@_JYJF.-XA27\_(!R'OJ1:*+E-?N@##[_L-\#\ <; (IG XM*Y62U8NR=2G"N(QO?"G@?$#DCZSEC6<=.8"P_ &X^O&*@@Z2$+06DR@WN2U! XMY:%9U_CQ(B*I#U^YPHS5*-.1 =##1.0ZC&:2^(-T*.M.J2,,A'H6)_4L2HIX XMXIL_W,:IQ'2&2T&2EJF2N*%_',R)ZE(/:Q(C *4I!CQMRAD!_ (YRT2$4WP" XM1-"\M1S,I&98K-',.P+#C@+UY4X/*TP :1A'R$@F;8S2&FOVM4>?W0@ ?X0' XML03IF4+"I@"M.LQ@T+9(6]$*,JKBB!W9]+H >,MV?**;VA0@A[I96J*^1X#5J3*2\N%(+&VWJ4OFIY;^(!4G.;++6;&.5^_;'V^T XMP[:*%6254GG./[(%P3ZN*#72_(<[ %#-4S+N<&K[#62\&1YD D.<^8+>/\S9 XMF#\"XC2:66=^VG$VR1#3+_!TD%@DA-N0D9D@("<>1!*6& RB9N66Y;%2UJ3/^(I,!T XM=#Y+S:FD( HS'5U1I?1BJ9?X!(ZLRN<]7$TJ6 NZ'4=^IY[CZ2F%<);6H*X5 XMJT1]ZU&W)=?IA+6NQ[OK!?7*.*H>Z:]'N>WKO4L:!,CVJN2]KA:36Y7K[K;U?J6K'D- XM+FP=:U7] !:[@L5M9;G+7,*4A[70#>]KIZO6XDKVMC)5+GLQFYWWHK*U\L7' XM7N?U ^H2U[K&+:-4\)M;;77W;/ B0 [!^Y3R")AQ4S-PP2"K-PUQZ+8/R&29 XMOHJGI49X=12.T(7G2& -5\Z\!0/8AYT98ON,^+(/,+'_;+,Z!I%.Q:<3GHL- XMR"=\R-A$(/XCF?IUV0,L]4 46U!:'Q0A&+%X1LCL$I,!8.1 ;NNV!U#RN4CL XMY+/=RZ$"R/#C)+:JD5HLBHW2\NSX@2L%.C/,I@G990>PU!<-&(,T.I_,O$,> XM#=F:+HZ%F@ >BSA$Z'9>(Y%$K;XQ$R#[W,B1;LMHVFG<)('.FS XMW:C-.HV;S7@C1PMS1,-TPVXEN7S; ,#C5&+Z1SL L%0G85I*:E,/,0&8F/K\ XMK#\VVI,0.P.86ULE3O,5LU)@( XM1=%>$;4KV"9BONB8B4O4BN_4J6\OV,LQSC7MRMU/^PC(E;KVS+I#ERC/(O+' XMDD)/ -23;$S9)TA@,9/BFI:48:-NK%;;;3SO>F0D,C),27)@+%R7OW1'V6" XM.:\&OJP>)^A9CI/6QWMZ+?7Q;.+2LP]Z;)<:A5F&'0!@.KNP]*X=OT\L/#US XM?OXD&O;=^U9"W+J&-)JFKZ_H'04J0/^PM'/<((C'EP&T@R#D-GQYF\OX4O#= XM8)<<]%2KEN#XM]VG@_?L/*7 "HT9JM6CZN%8T3/^4O2&F6,\ V[N-)-_0.6Q XM&,4"V IG=JUCYOW2\P.\US7]:0^=J_$[.. XMP-RZ@M]?L^GD0H#S<8#"L2,\Q7G_0S-9)$ /$P#G@U[_ XM GI"-"*6@8( 8!T_0##X0"X!@!L%> >*$.IDB(H1A9#9B$E:!P*UCP=1#LCLA\K0C2>& "@2!A^-C,NLVK&\X@[TB-@.'K/ XM,VYHDGYF! #I@$FFAH51P8T$9R'S="=PDRA6]B57(YHJ> XM$3N!LHX!X'ON2!GPN'$HU2B. REX\AV4,DZT T6%6&_R$2H <$16@3WH4"K5 XM)AE6UBJM!SF7,8Z](1MZQ!%N@V^O@RWIF!_!$AB;@Y&>82KLIBJG QZ:1GP@ XM4I+6U'/TT7S)-"W]87@MF1\6"0BD<@Z!<43JPBQR9'/U)'40XQF()4JC)5%L XM14Y#:2;;\A_E,!_\L91.9QM0]S)0Z7H:LF.4 4N'V"V; 2Y#^0&UQ ]<62[* XM4CS<\4L6\VH/54^8(0#PXCQZ]EB6Y9:XIE[_00X \)4.,G9_YY?FD2TH&"UH XMEWEJ!P@ LR] )Q4 0S+^ 2 F8AV T)6-41KYH0V+Z5#NTAL?F" (Y6,P4YGZ XM8A^9F6"<*2 5!PZ@*9H?0)I_8)H0^)"R F6V05*NF5>W:!5'F(FS8UR[\6QS XMMRVY.1^\:9IZYR2]I)K,YRR!-V5/<9RT\7+*N8\=IDU2D2:99!W ()H/0)H_ XM0)U[]YT"()QX:3&8%V_>:3LD(V?B:2E#9Y[V@9[JR9[N:9WPT'?9N3J"1V7W XMZ1GY^8I"Q)_G]IQA@66IWRLCP"X'!V67'U*.4H61 :J%I9H@&FIHJ.B&:28T9Z$P2 26*03B)FJJ)H6J%K:II7 XM2HU9.J-SJJ0W>J>;D:<\RJ=3ZJ=2D:96ZJ8.&:-QNJ5(^J%U"J:+^J2-BB)G XM&JF VAB"2JGY9*E:VJ%=BJAV*CZ=FG)C&J6.&FH_^JO6B2;$:^@NAGURAKW*D#>5@"X,FEHYJ\98SQ' D36FH3+ XM0S+R&FKT6A#>JK"8(:X,&XTV"EO^:B,XXK&= 1K0UVD:^V]'E[ #[U6+9SXR5@ XM G'D=WV.UF\%DR7^0+>!P!V&P"":ASU*%Y\59\@R8/[U(^RB7NUP3>%67'\\*MT.P!V"P"F*3I3)B40 XMRV)"IABP&IJ\,C:YLPT(2(KOBVE;D3P5DZ', XM$R3!2($"BQL;989>"@R(Z;^- <#"L17ATCV[QXO?M)=V(VC<0H?H59(^=[_; XME5']L1RX 0YT^P>:T1$?8,&9%H+;!D!1) .DSGH8T (Y&&+=B/HHS!\0! ,"'!!AL!#F/PAB2ZQV0 XM=$?J6#"S)DO%B" XM:HI6AHIPQB9RIFSPJKFTS&4HJF,LE*QNYJ,%6\5^]B$S0I\DP XM5L6\432:DX[=C+NWS"NY[&N3:[8FI1YW^6ZZ^FW'IIF!R1D/Z<!03 -I3[J:1FVXPVG&2O8*9*@)&4-DE=J1XW[%EC-TS.(1WJT XM$S8T>-6TDZ9>S2M@C404+HL2^#PX2-QY8%DY'' XMU';AX$'302--BVI/RSU].;7">%U!1*)PG3,_0BA?8Q@_XMA>.!_BP'I3]\=/ XMP[O:QAV'<7OYQ\/;0MIYQHZU[6G\X-@O\X6I34H!<[K'=Y+*5W"VTMEM.SO0 XM1SG3UQ__MCG-;17:&$74-PZ$45(8?)!LDKX+F9KC=UWLPRFQ$]U=Y7ODK8V: XMUH;6+0#Q%8DKUBJ89Y83AG_;_,HIZ2G_9V,NV1_YW=B!,1A9\@#6'3Q3!C6G XMB#KVMQWX1\S8VMG\UQS]_7L_X#<1SML SAH#/B_#(VB[B#P+6#'+TQ$Y+7%K XM^3']C73SX7LG[M@JN:\9CL&Z6,V3RQ@O&(& !N XMH3_9YB1D#4!KJ->8QRM7"\^;K:/&09J.BF<% >>BR;4_$.8T@SC]DYJH:B.) XM)'A2D4(N11E(^*[ .?Y>^@F(IH_((-XKL0P4RD*%Z?U4;-= P]%>%X YZX$ XMJX1;N:WP0)H?BR=+Z!I2^'J/@D$,R69/%Y*3+429[G_@2;R=_J.?SA%4NBV2 XM.A^FSH/QO7PV]!L8\%&Z$O"(D$VNVA[#^9G3,7C#VZAF]GFQ]7$/UX,NT634,D]7<+)T/H>L9;-!K?GFMX XME!RDJ4G(2#OY+IH!8!T/H.ZOKI DE9KO?E;R[NU_\+D1)@N]"Y._6 XM<0 "WWIB+.P<\7EFS.WSWMD(K$S9*^X/_[8Q._&\4O$73X4EC)P;OXOJ@=$O XM2.]<]GJ6\870\;9%*T1(JR$KSWHYV3I8&//GT?1Q#_5?3/= 3]-WGX7,F/5 XMMO1_#_<]+_9S7X)D3_7@:K_>& XMEQAM[_F '_IC7_KY=OJ(K_:J3_BM#_&?#_9R_UE[PWH?G [G2"$2LW_BZ__K+;^IJ%-.5_RAP],=TE/B8 48[ XM/KA=W[F0O_T.TOU J4BM=[-_+!O@R!L@_2N9&VZD^7M_4!V;$?FM$2V5LN-J XM6.U["\APJ-MME_]!M/_JO_^1WQJ*$4H>(].+U(;.F$J[$8=3+$I2'42DB>+] XM1IJW&_8!X!K65)(%0%+!Y+[SX8S&)"=Q.,51'4X319HHWF^D>;MA'P"N 9@XY5P(!6]B$5P_E5;O48BZ-WI792Z> XMR1^(>9BFS#83UH,6-F!J]AXPU?+#;"16CF<$P[^;2"".2=9'S=WSQ[ZO7HDS XMQGCNJFP$,ZL!LNB)N2($HLL7EE+1BJ@ZA<$]HGA98[6(1C#R2HMHHNN).1\$ XM@JJG,\V8D;(^RJH]E^9B:J)DNJ9-"*B^Q^72,0#) XM8NF4#; S [7;I-E5W/+*KLU\\P!$8S2GDAQ<3BS)\OWNRS375O]^.Y5#U'\I XM.>A=HT+]$3:"TQ](.3A_8#;$QU.6BWS2^\\+>?2QIGO&&[L!U#>Q[!F"LRU( XMF=AFP]X='&\6-F#@8;T@)SG:Z]GYU[W&(2R=V#FC(D1(.3@'8#8$;KT14G/S XM$MS%4Z );'[A_@.:G".DM<++D?^6 XM2$[9] %?@S(N'$']D9'V\P?X(^8T7.8D>.: _E0B5+Q5O.:+]PI=@P]1C">> D0GI"%%5)1)Q#ZU! C'F$1_X$2# XM3_FRWV6T3_1J_Q>WA'=*FBHQE !U"AB2CNBQ\W;BN+"2&VTLVN01E " XM -BIAMD.)>,98CY2_8L)AM"TPFV_TSF_YI>_19A_K)&T/0&UL(LUVXN<(E[+OSC4.U[-Z3^(4)V9L XM25!] F4G3&BN*- XM 7/)L4[2%@#4YM).VSAKZ-2KD^T[V6U6"V/UN^E$1SOECN*- 7/)L4[2%@#4 XMYM).VS@W.=.RXD[%&VLPENW^4G2X/KM\3U"TLT[2%@#4YM(';I,X5]B&SW,W XM'>XPENV-P=.T4^XHWA@PEQSK)&T!0&TN?>#V@G.%O2TU[28M'VLY+70F4G2X XM/KM\3U"TLT[2%@#4YM(';B\X5]CUSG,W'>XY;2L9+!5%A^NSR_<$13OK)&T! XM0&TN?>#V@G.%7>\\=]/AGM.VDL%2472X/KM\3U"TLT[2%@#4YM(';B\X5]A" XM5--NTO*QEM/5PM.T4^XHWA@PEQSK)&T!0&TN?>#V@G.%+40U[28M'VLY72T\ XM33OECN*- 7/)L4[2%@#4YM(';B\X5]A"5--NTO*QEM/5PM.T4^XHWA@PEQSK XM)&T!0&TNG;(Z92\X5]AMV1LV/1_!F-/7PM/,L>\HWA@PEQSK)&T!0&TNG;(Z XM)1;OKQN@T6$\5XXCG]/LRC=$QQS[CN*- 7/)L4[2%@#4YM(IJU-B\?ZZ$?R] XM(5)X$HPY;?P@)'='=RXPEQSK)&T!0&ULLCH48G/O'TR3P52>$8PYW1D@)'=' XM=RXPEQSK)&T!0&ULLCH4XI0SKVG-*E)X$HP_@'7V6[',88;G\G4U!7;4UG2K XMKE,W._--K=13*9&O\P-8-QW-(7>(6Y@*^ ^%M$Y@1VU-M^K:>;,-4I99XE]J XM_#H_@'6BM"URA[B%J8#_4$CK!';4UG0+TNH10Y9ZJ;=_*;AMC75IJ77,<4[? XM^W4U!7;49M1(+I9YN8:_&;5_V7^+!T'R 1I;?5I6GL&%9!6#%'Q_@'=&'9)E XM5Z :\C[@99.2"!I5/,*BH=87!B[^5'?_4$A6,4C!]P=X=[IC/-:L:=:4#61U XMLQEM-V,M?V$<1'<:\G4F,DC!]P-XYZ+?L7/R*2DY_,_.:GB>DGB$3?4P\GJ0 XMAR)?MRV#%'P?@'=Z_3#-VM?I"K"<7_7&OGBMV&:_\N.2]P^%="2#%'P?@'=H XM3K*#QGFO;FDI"ZN0>4+YB![+89'Z_G7V,4C!IWJ2/3R,@85EB]DWTS2;7:#2 XMN!R>0MK$^+9I54A<-DC!=P!X]_T7S30-F/8\];WPE!V]T M5@J);$Z]8B"2$KI##8EQR#E'UX1TIZOI#4BDS! XMV]W'/>CEI"'CS64K(BK2H6GK@$L T'YXQ]XI9F$#!A[6"W)Q8EWCR;99,QCH XMA\C]<1KLUQ]/48!_<&L$;KT14G/S$MQVN>"70_,2!>%2[JP)XL2O#L7&;ER;+CN= XM'NI>N3N>L0Z;\11/>&N#3_E35!]DC/ >O_D-KV_^4/&BPCOJL#UE>&ME#4>) XMQ,>*P1@D:5>3C'MME_]!9(=?DX?]X8G]STO?DTV( XC.)8B\08@CK]9"E8BQ XM3(:Q3(:#Y9@B^8CM#623B'F5"%-EKYS*MHDTF(./2'@]TMGI V[+;IM?DXW],9"T XM1'!3^XCU[[?;QL[>YN>%KGL]2^CKJ,SPD(WV,9 /<"9L8KG]W,'Q)AN;9QR] XM N7A3O5T XM]DQS9F!P#&0!G8I KUOTO(]](WALCQQ$EY\-?V!RB\0,8 XMN2TP.1VFXM(IJU/V@G-I"5@\5XZ>QG\:N_5E8BK*E2S*Q>73(2I&O2"MKM3C XM\U3"])="LF7EE>R$>2[0Q)7),9< XM>21?3B!'LAJA6QJ#"B: P:MRZJNLVG-I+J8F2J8H2JLR2"#'VKRE4;/U"4># XMQGFO;FD\6\6&2.LNV^RXCN^>02#\#@",7!ID+[:!0;8T$]S@\;>T)K#OG-QI XM[O5Q"_5Q"P#C$!ACHX;"Q-J4"S.6N\95G9(_ L:WW?_; H"N<200,@[S,3;$ XMIS;#G7RKRWS$J]:9'+L!9'VT"P_[ZAJU"P#CX!EC0TIZOI#4BDS!V]VMZ[-K XM>;QK-+OYA0_[ZAIX+X*Z'^X.1_0"#Z"P#CT+\( XMN%+_.G_L6X).W6.MLQY9,[_/9SNX@[_;Z@]._@<$HK\ , []&\"]'"$U-R_! XM73P%FL#F%^X_H,EYXL!;Z^1W3C/BP&4![*$<3L"\6SP([, *//(,+$KW^\"W XMYN1W3C/BP&4(6&D<3L"\^U2YT3K;H< C#T'Y%-4K_/A6H<+3X1I6L1SB$!B: XM<<'3\>&K3FC'])MONL++D?\0Y/*XLQWJ;Q4J/!VN817+(0Z!H1D7S#U&O>H< XM_)0VGD\KO!SY;XE!\S[;H?Y6H<+3X1I6L1SB$!B:<<&8[5 RSL%/:>.DM<++ XMD?^62$[OLQWJ;Q4J/!VN817+(0Z!H1D7C-D.U:H<_)1B03D@O!PB['8XBHDK XM7"8:I<+3X1KA! #BL"*:<<&8[5"MBI>,T2#D\Y F*C$A+-5NAZ,?8L)EHE$J XM/!VN$4X ( XKHAD7C-D.U:IXR1@-0CX/6,T2#D\Y"T \++(<)NQZ3OLQUEHE$J/!VN$4X ( XK XMHAD7C-D.U:IXR1@-0CX/23L@O!PB['9,^C[;428:I<+3X1KA! #BL"*:<<&8 XM[5"MBI>,T2#D\Y"T \++(<)NQZ3OLQUEHE$J/!VN$4X ( XKHAD?B-D.U:IX XMR1@-0CX/23N"ECY2[79,^C[F428:I<+I;B++(0XKHAD?B-D.U:IXR1@-0CZD XM)VCI(]5N]SWO8QYEHE$JG.XFLASBL"*:\8'<<[H+@D/;DU;D0WJ*)#$O1M J XM&)R7$<3G9"(JG.XFLASBL"*:\8'<<[H+@D/;DU9,OI<[7#=2[79$]_)!?$XF XMHL+I;B++(0XKHAD?F/BGNR XM#UIQ>22*3$O1M JJ'!^$<3G9"(JG.XFLASB XML"*:\8&)?[I(#GA^S$8,@CO=:1ZN^\-N1W0<(1E!?%H2!3^N$4X ( XKHAD? XMF/BGB^2 UX9LQ""X8XHO9C<)9"(*)QQ!?%H2!3^N$4X ( XKHAD?R+M54N8D XM>,/D&BV"]F(]O.;4>H/WJ^]X,L0YK*0[Z).8T7.8D>.: _E0B5+Q5O.:+ XM]P=^)\1KF4*N(9CBH$_ZH^=.TI@OHL$,L0<(?F"*0[Z XM9$&1KO&HRD&5_L0AI)\D9$(K^0%^A\7;FT*N,7KB0%2G[JIYA5"3GNW:N3U= XM@P]1/!V# ;L]>Q@O0BI9S!&4X1JC)PY$-?@)">S7_B511C-1U.U_X4/; D3F XM3T1_D=ARK,+7D8GBX,.#3_FR7UNT3_1J_Q>- XMTDJRG=.@# A)I,RR%!@$PH_BT'P[Z3X,M!N4[%R":$_B1$Z./2'BP1B0YWL;=_!3"8C7&$0"N06L $ ZYQB93^XBEPU-4H^V^ XM;C[@MHI0OAD)#3:QN!G\]@<$LL8 $ [JN,_.>))X!=!V8BGF(]6=;= (_9 * XM[1D,33LK0B!K'0X//=&JW/WQ+;Q-L]$EF<6X=).VS@W.=.RXD[%&VLPENW^TM.\ ]2TPRNN(17H$3%\;]0+TNH10Y9/ XM-75_*;AMK2O&#QI;C=7YH=5RUQ@$8M5'PJ!AK?&Z3-:M.64%+(F&N-8J6+5Q XM!]<^W1ASS1R\0B!O'3$!@^;Z2D#/ZNK#HZZD%*HVNVQ^V73"BW1^D[1GX(^/?X*IJ*$RL XM3;DP8[F$GARS=FAV8]O6A]M'0MHOE-O?8-'$QU.^>R/ FZ0<>=R#7DX:,MY< XM-E/?'"+HUQA.%"*&\0UK=-W@I;[OW3@O8Y8H1M\[ZL.#B]]L.,$7I^P4G,6$]S%@\ B'DNB%\)"=.+G(BP(O*_XL_ X T">\&8[5"M XMBI>,T2#D\Y FRA%3K9:C9[\FJN4*8Y%=MAIF8Z( T T:4A]B3L,;ZG=K-++] XM(>CBMNR>_:Z @.@2"@@R2"!6H0V!<>JNFE<(->G97@!"^.I<%NN7S]@MJZ*W XM3HN0^@$$PF7:H"_E35!]DC/!%K_>&T? ^[/I<*_K9\/)Z3!A\')5[JU.3 XMK-L\D_]!M/_J;X?8,9+760 D%4SN.Q_.:$QR$H=3'-7A-%&DB>+]9AT!@!V] XM8=,S4U* Z%P50U8858AJ75XEHKS#B!V]X5^3&U]1M6+"1HGZE$QN/"Z&HB$M0AG6]E^EPU-4H^T\^#!^'N4^^\,'C2:Z/QV&HB$M0AG6]E^EPU-4 XMH^V^;H[6-YN>%[M953.AHKJ\KT9HYS-CEM+/(F0RB&PAHM0AEMTDWT^,_V:">68H[O XMNMR;\8]$(QUQ#) M0AEKD[H='&^RL7G&T2M0'NY43S=&@N(<82B\TB*447!V XMXN<(E[+OWG!0%$N<\CQ&$DT 8"B\TB*4L9#>-T/"VS2'9* 0.?(2N2NA0C;Y XM82P T"*4L9 KUOTO(]](WALCQQ$EY\-?V!RB\0?BDMC& @ M0ADGU9&-LX;R XM?1F-Z4YKAY)9 QI#Q/=?0RC&$ACI0ADT1R$V=Y,SO?"]8=,CY)/\QS<7UACB XM(A6#HWVR!ER1@B1976997U/AWB(A5)] #FLB+ITAUVB4-Y XMJ6F_&;5_*22!65[(09B*F)B%B2ZOT1UCQ^>K:1NM.64%+(GY1.C;NYR;*3!: XM_4 ]GBZVL7<%"J<;JJHU^J6$Z=GO2JQK2H,HHZ:$DBZ](7B"MGG;L^$Q0[%W XMP[)$XK(A*XLI7Y@!D"Z],44TPAA86+:)?[J:/41Y\L[)+30JM#UU2S;ITAM\ XM[+Y,6N\95G9(_ L:8H%TQNF*SS.)8C_O)!''VNZ9[RQ XM&T!]$\N>X3L?4#B](;W_?%(K5KW@ET.2H[V>G7_=:QS"THF=0S:'43@10HH& XM7G.H\^'WE\#F%^X_H,D>PT SF!S60S8<43@1 N,.PH#6W,&_"28@O!SY;XFV XMDTT?\#4HX\(1%!@4I&*N3>9)[OR +C'#W,-KOG@,I$(.I$\21$'=P8-GK>H_ XMJ/':N3U=@P]1/!V# ;L]>QA%=$0M] _D0D'I\?O/7["'3_1J_Q><$J:V[:32 XM$I=PK!F,,0#K\!JV$4IY MQ3=WRI)">-TDJRG=/\1$NW'42Y- ">U!LV/3,E XMM5!2]9L1A4^%:XFWA<)245@?]1J] 2^86IP[HLJTYSB-4CG$/)ZKF&3Z[6"> XM 5)P>H^9*FBHQE !U"AB2CNBQ\W;BN+""&D@U1N [1V==[K"=B6$!VM$HBO) XM5F2UYFQ6ONS2]@?K1AG6]HV\J^IDS8V\I^2.9(H=^SE7H%G#3L6Z4L3:I XMV\'Q)AN;9QR]8C>PFV_TSF_YI>\8]P#K1AD+N6+=_S+RO2"R,G)=;F]:!M)J XM:15%EZ*V!)XQMVZ407,UZ?TS[?([>=/A#F/9CO12472X/KM\+VT!L&[=P92M XM'C&85Y99XE]9ETP0I+;;(G>(6Y@*^ ]@MV[=43PBZ9@%JKV_J39G!AI5/,*B XMH=87!B[^5'?_$'Q_4'D<(1;U$9S9F='L,7D_4'F] XM0:X72D#/ZM=K!MC3,72#_<.MV&:_\N.2]P_!]P&5UQL)"D>#QGFO;FDI^Z[) XMW=E5'-7HX26G5T_!IWJOT1M,6S<44K:8?3--L]G&!?++X2FDG>*ZGU;!=P"5 XMUQMN1&7F[!U]"QY_2_((#-*NNWN?0.SC6%2/5_I^2B0BCL!P"5UQNFNU#; XM\;ML$KS=?=R#7DX:,MY_8O&%=X:,MY=;J XMF^W?;5SAK2'GQV4I7IA V7Z5UQO8O9 ^A9!GK;[9_MW&%=X:=;JF^W?;5SAK2'GQV4I7IA V7Z5UQO8O9 ^A9!GK;[9_MW& XM%=X:=;JF^W?;5SAK2'GQV4I7IA V7Z5UQO8 XMO9 ^A9!GK;[9_MW&%=X:=;JF^W?;5SAK2'G XMQV4I7IA V7Z5UQO8O9 ^A9 -D@#JZP\&( -8L!7?;5SAK2'UX; &( -8L!5M XM*"K$PGX 4'F]@=T+Z7VNF@#JZP\)H 10 0>\2-9)=[NFP!* 5 P&4I7IA XMV7Z5UQO8O9#>MU() )+^P !* 5 X!$_4GZ%[;X,H 10 1D3?VG36#44Q* 5 P&7$"$CLYWZOT1OM XM?5(K5KV)D0#7FP!*( 5 P!'6-9YLFS6#00 )H 12 1<1HR Q'[N]QJ]$5_J XM^]Z-\S()\+Z&, />L!6YLZ,^_).#00"&, />L!59HD+]<2P%< XMUGLS-1\<:("O$2$"'"&H]BS!73P(+.*Q)'HA+$3_]]/K56\%^ 'O%R$7\N&K XM3FC'])MOBN-8"V,6Z) 9N"T;^ \%^ 'O%R$P3LU('3YI13X/::(<,=5J.7KV XM:Z)/OSF#\R'_4( /\'X18N1AC5A;VH9LQ""X$R=/_J12'BV&\>4T:(/"D8/O XMIV+PUC^-^2)Z/+(F(NCBMNSNNH^''HN[LR)/^'[=P8-GK>H_J/$%((2OSF6Q XM?OF,W;*0JMAQK2$%:&NOT1WZ6.T%3\8([_$*7Z#JZ/#^ /"BPCME^'X5K9?P XM_RCRWS0Z1?WW7ZW@IO2]UQ^>V/^OT1LC]Y#$-W7'ET/'%(=3G)8F(D[6$9!8 XMK81>2(@4 P@("E 4D1* XMDR)38LAP$43*D( #4(@04B;,�B6( @:!#A"1!&ZK@90R?-&S<@L"1)DD*! XM@H *J*!),P<$31!A0-@I(R0"K!)1$Y:H XMG3!*?]81H^8V'1=H%11QH^9-GA N Y)HT0*$"A#D,6?/\J;.Z# ^R="D(R>- XMF,-%R]ZL31)L43-AE<&&3Y^!($053#!1!!5).&'@$PT1,05.6J)U.BPK&J0$Q4I)5JO $V1QB5P872 XM5'> *I[:ZT!JT]W2+D&=MEM(449I+51EQPZ<%K444F])89/:[5UW5,RU3&' XM1M..QI9;4F65'VLCJB&O9V9AUBZ^?DX[W!QC!(B2A]*V-UR%IX%@AI1T ?86 XME(K1$=A349=1;A!E02<;GS4=X=02@&J,W!LUI84"$G;B!L(4[:V%0@@IM!10 XI!7#7#<(0((L%6!I0S<$&PT34MQ-:%>"M-]],@#####;,<(-&6@H.&@ I X Xend SHAR_EOF if test 19738 -ne "`wc -c < 'beach.uue'`" then echo shar: "error transmitting 'beach.uue'" '(should have been 19738 characters)' fi fi exit 0 # End of shell archive -- Bruce Holloway - Terminal Netnews Addict {seismo,sun}!amdahl!drivax!holloway ALBATROSS, ATARI*TROS @ Plink ALBATROSS @ Delphi >>> HI, KARL! <<<