[net.sources.mac] Another

jimb@amdcad.UUCP (Jim Budler) (08/05/85)

I don't know how many people need this.  Our Valid workstation complains
about the use of the & operator between an int and a boolean.  Therefore
I added a cast to int to fix it.  It still compiles on a Vax of course.
Here it is.
---------------------< cut here >----------------------
*** xbin.c.orig	Sun Aug  4 13:27:45 1985
--- xbin.c	Sun Aug  4 17:33:09 1985
***************
*** 102,107
   * revised jcb 03/30/85 -- revised for compatibility with 16-bit int
   * revised liberte  07/12/85 -- added trlookup for indexed translation
   * revised vishniac 07/23/85 -- picked out some more lint
   */
  char usage[] = "usage: \"xbin [-v] [-l] [-o] [-n name] [-] filename\"\n";
  

--- 102,108 -----
   * revised jcb 03/30/85 -- revised for compatibility with 16-bit int
   * revised liberte  07/12/85 -- added trlookup for indexed translation
   * revised vishniac 07/23/85 -- picked out some more lint
+  * revised jcb 08/04/85 -- added cast of boolean to int for Valid
   */
  char usage[] = "usage: \"xbin [-v] [-l] [-o] [-n name] [-] filename\"\n";
  
***************
*** 583,589
  		obuf[1] = (ibuf[1] << 4 | ibuf[2] >> 2);
  		obuf[2] = (ibuf[2] << 6 | ibuf[3]);
  	}
! 	if ((eof) & (op >= &obuf[eof]))
  		return EOF;
  	c = *op++;
  	if (op >= oend)

--- 584,590 -----
  		obuf[1] = (ibuf[1] << 4 | ibuf[2] >> 2);
  		obuf[2] = (ibuf[2] << 6 | ibuf[3]);
  	}
! 	if ((eof) & (int) (op >= &obuf[eof])) /* cast needed by Valid - jcb */
  		return EOF;
  	c = *op++;
  	if (op >= oend)
-- 
 Jim Budler
 Advanced Micro Devices, Inc.
 (408) 749-5806
 UUCPnet: {ucbvax,decwrl,ihnp4,allegra,intelca}!amdcad!jimb
 Compuserve:	72415,1200

"... Don't sue me, I'm just the piano player!...."

nikhefh@uva.UUCP (NIKHEFH) (11/13/85)

A new Crabs DA, and 2 other screen demolishing DA's.
SOURCES INCLUDED (in Aztec C) !!!!!

Have fun !!

#  ------------------------  Cut here  -----------------------
#!/bin/sh
# shar:	Shell Archiver
#	This shell script will extract:
# crabs.Hqx, crabs.c, collapse.Hqx, collapse.c, flow.Hqx, flow.c
#
echo x - crabs.Hqx
sed 's/^X//' << 'Eof_Shar_crabs.Hqx' > crabs.Hqx
X(This file must be converted with BinHex 4.0)
X
X:"80bB@*c!%4'58a%68p@!*!)$B@GM!#3"!%!N!-06!!!$%`!N!-j!*$b$%KN!*!
X%!3#3!c!$N!!$QJ13!!0L#%0bB@*c)*!$!%Rk$#ST52r%+8Rrb%je)'cra%je6PE
XrmNMR$""KiLJXrmJN4%UU!"jQ!!*d*%3[#Lmm!!!"aNkk#j4B6b4I*8!!&#m!6VS
X,D&K2*'crb#*U!"3U%54%,`T#Td+R5'cr[%Kkrj4#Ccmm!!)[22q3"%*R3UHT%b!
XI*N!NAb9!!"iN4$GU!"J!E#4&*JA@[!#3!m3P3`!i*%8[+J!iU'p#E[rm$'i!"2r
XmE(`f,[rmar`!$L4$eF9#DJ!'0Llrr-Im!!iN3pA&3QS!#$BZrrc(r!!1*%29a69
Xm!!J!#MBZrrc(r!!1*%29a69m!!J!$$BZrrc(r!!1*%29a69m!!)!"$BZrrc(r!!
X1*%8d,[rm5-,VJY5&e,`!N!0%*B)i!&*ZrraJ!2pq*%8[%NKk!B#SCL4&,bS!$NK
Xk!CDSCL4&,bS!(%Kk!DbSCL4&,bS!+NKk!F+SCL4&eI`!N!-m,`T)HJ(8U'C#E[r
Xq2A`!!Irk3Qlrr!aZ!!Vrr'`!!3`f,[rm5-2PJb4$eF8eE[rq!9Jf,[rm5-2PJb4
X$eF9#DJ&D"Qi!-rrq0Llrr%M$jB-N3pA&2@S"@2rd0Llrr%M$jB-N3pA&2@S"@[r
Xb0Llrr%M$jB-N3pA&0LS"@&"$282rq$BZrra)`q@$*%29a6BU!9T33ce$rrBf,[r
Xkar`!$YD&,`-N45*U!$K8L5m*0LlrqXIm!!l@K9b$,`0)E[rb3QG#TkMX0Llrr%M
X$ii-N3pA&0@lrqJ'S0Llrr%M$*%29a8)U!E`f,[rm5-2PJb4$eF8f,[rm5-2PJb*
X$dm8eD3&B!B!f,[rm5-2PJb4$eF8f,[rm5-2PJb*$dm8eD3&D!B*5E[rmB!$qlL4
X&eI`!N!-m,`USI#4%,bS!&%kk#4jB6dkkr@j`!%cI#$"1ANje)$Na-*!$1$!`0d8
X`-$3b-$!i-6!`1$%`-$3b-$"#4$!`!#"#4$!`0$)`-$Ja-$!i-6!`0$)`-$G&-$!
Xa-*!$1$N`-!!J3M%`-$4$-$!i0$!`1$8`-$Jf-$!i0$!`0%-`-%)a-$!!)$K%-$!
Xc-M!`-M%`-$Ba-$""-6!`-M%`-$-b-$!i4$!`!"""368e38%e08&"069"368e!%j
X@!!![#dkkr,)QE2r),bX!(UN83UX!(LmV!"41ZJKH@%p1Z[bNF!!QAdjH6R919J!
X!F!"1ANje6PErj%MR#""1Z[ai*Qcrb#mV!"41ZJJD@%mNE2r))QS!&#J4*'cra$!
XU!"TJ!!CN*%3[+J!iU(0#E[rk$'i!#[rkE!!'6$BZrrT)`b4$eF4++J'mCNJf,[r
Xk5-2MJb4$eF3[#Mmm!!8r22rl6VS'4&K2*&me3!%`0LlrqNM$ii-N3pA%,`Sr2!!
X&2ccrqdkk"L*B6b4I08!"4'!!!4if,[rk5-2MJb4$eF3-DJ!)!6"Y)MBZrrT)`q1
X$*%29a#m+3QFr22rr6VS&kPK2*&r4DJ%`B&Jf,[rk5-2MJb4$eF3-D[ri!6"Z)MB
XZrrT)`q1$*%29a#m+2c`!!8*R6VS&Y&K2*&r4DJ%`B#)f,[rk5-2MJb4$eF3[#Mm
Xm!!%r22rr6VS&N!"B6b4Id@S"-$BZrrT)`q1$*%29a!aU!!J"4'dL0LlrqNM$ii-
XN3pA%,`T#Ccmmrrp1ZJ9F@%mNAp&U!84J@$BZrrT)`q1$*%29a!aUrrJ"4'iL0Ll
XrqNM$ii-N3pA%,`Sr2!!"3QG1ZJ8Q@%mNAp&U!84J)MBZrrT)`q1$*%29a#m+2c`
X!!6mmrrp1ZJ8#@%mNAp&U!83f,[rk5-2PJb4$eF3f,[rk5-2MJb*$dm3f+3%`efS
X"@$BZrrT)`q@$*%29a$BZrrT)`q1$)N26a$BT!86ADJ&D0LlrqNM$jB-N3pA%$'S
X!!!&BE6if,[rk5-2PJb4$eF3-DJ(i!9KZ+MBZrrT)`q@$*%29a!aU!!!"@Qd@0Ll
XrqNM$jB-N3pA%$'S"6J&DE`!!bMBZrrT)`q@$*%29a$BZrrT)`q1$)N26a$BT!6#
XADJ&B0LlrqNM$jB-N3pA%0LlrqNM$ii-L3p2%0LN"4*GU!9Sf,[rk5-2MJb4$eF3
X[#Mmm!!8r22rl6VS%$PK2*&me3!%`0LlrqNM$ii-N3pA%,`Sr2!!&2ccrqdkk!qa
XB6b4I08!"4$BZrrT)`q@$*%29a$BZrrT)`q1$)N26a$BT!6$ADJ&B0LlrqNM$jB-
XN3pA%0LlrqNM$ii-L3p2%0LN"40GU!9TJ!2lS0LlrqNM$ii-N3pA%2bS"4%kk"1j
X86cm!0LlrqNM$ii-N3pA%2bS"-%kk"0C86cBIYN"Y)MBZrrT)`q1$*%29a!aU!!!
X"4'i'3QlrpQ!'2A`!!IrfB#)f,[rk5-2MJb4$eF3-DJ!!!6"Y#$em!!,rpQ!'2A`
X!!rrf0LlrqNM$jB-N3pA%2@S"J2r`0LlrqNM$jB-N3pA%2@S"J[rZ0LlrqNM$jB-
XN3pA%0LS"J&"$282rp$BZrrT)`q@$*%29a$BU!B*33ce$rr*)E[rZU+0#E[ri(A`
X!rrrP0LlrqNM$jB-N3pA%2@S"@2rq0LlrqNM$ii-N3pA%$'S!!!%`EaJf,[rk5-2
XPJb4$eF3f+J&DAN-p3rrmB")f,[rk5-2PJb4$eF3pDJ&Drr`f,[rk5-2PJb4$eF3
Xf+J&BAN-d,[rqY%0Z(%*R2blrrMmZrrbSC4!I5J"R"&*ZrrK5E[rqB-S-EJ!%rrK
XR"%)Zrq8f,[rk5--N3pA%&@lrj3'm5Llrj@B!!5Jf,[rk5-2PJb4$eF3pDJ&Brr!
Xf,[rk5-2PJb4$eF3pDJ&Drqif,[rk5-2PJb4$eF3f+J&B8%-p3rrd0LlrqNM$jB-
XN3pA%0LS"@P"$282rmNKZrqkSScBZrrT)`q@$*%29a$eU!B$rk$BZrrT)`q@$*%2
X9a$eU!B,rjMBZrrT)`q@$*%29a$BU!B"33ce$rq`f,[rk5-2PJb4$eF3f+J'#8%-
Xp3rrU0LlrqNM$ii-N3pA%2@S"U2rf0LlrpXIm!!l@K#m$*%3LDJ!i9)N[#6BZrrE
X(r!!1eS4FJbm$5'lrjN*R3UHSl$BZrrT)`q@$*%29a$BZrrT)`q@$)N26a$9T!B!
X"@$BZrrT)`q@$*%29a$BZrrT)`q@$)N26a$9T!B)"@Q!!!-if,[rk5-2PJb4$eF3
XpDJ&BrqJf,[rk5-2PJb4$eF3pDJ&DrqBf,[rk5-2PJb4$eF3f+J&B8%-p3rrX0Ll
XrqNM$jB-N3pA%0LS"@P"$282rkMBZrrE(r!!1eS3[!b4%)QS!1&5*,`Nf,[rfar`
X!$YD%A)-[!dKZrqC#Cd+RU1`f,[rk5-2PJb4$eF3f,[rk5-2PJb*$dm3eD3&B!B!
Xf,[rk5-2PJb4$eF3f,[rk5-2PJb*$dm3eD3&D!B)f,[rk5-2MJb4$eF3eE[rf!DK
X5E[rkB!$jVQ!)N!"m!%&R!2QB,bX!&%kk!CTB6dkkpHT`!%cI#""1ANje6PErr$B
XZ!!U@EJ!)2`-[$dKXrm`r2#!1UHY86f!)2r!!N!C)H[rf5'crc$mm#!#Tke&25'c
Xrc%K[!!3r2!J3UHY#CkKK-"mr!%kk!4486cm!,`p)E2r-2c`J$URV9%p)9dKXrpB
Xr2!J1UHY36dKXrma)E2r@2c`!"+RVB!K!i!#3"NKkrrC)E2r@2c`)"URV0Li!#$m
X$,`p)E2r-2c`J$URV9%p)E2r-5'creMmm!!#TkdKXrpC)E[rm2c`3%+RV5'lrr%K
XXrm`r2"!1UHYJ#!#3#%KkrrC)E2r-2c`)#+RVE%4)E[rm5'crc$mm%!kTkf!)[r!
X!N!C)H[rf5'crc$mm#!#TkdKXrma)E[rm2c`3%+RV5'crc%KXrq!r2!!3UHYJ$NK
XZrra)E2rJ2c`3$URV98p)E2rJ2c`!&URV5'cri%K[!!3r2#!3UHXf(c!$6Pj1G8j
X@!!!-EJ#3!`K["M!Z!!KJ"M!Z!!K%3%jH6R8JE`!%S#P1qJ!U)'m!"+!U6[S!)#"
X[!!5J)dlk!"BJ,`!%S5*1qJ!#3qhrrM+!)!K1G82YrribJ%je!*"G(!!b!!"%8PC
X5!*!$#J!I!!!J!*!("J"$FQ&LFaFj!:
Eof_Shar_crabs.Hqx
echo 'Original Sum -> 00007     5'
echo -n 'Current Sum  -> '
sum crabs.Hqx
echo x - crabs.c
sed 's/^X//' << 'Eof_Shar_crabs.c' > crabs.c
X/* ----------------- crabs ----------------- 
X *
X * Implementation of the crabs game for the
X * Macintosh, written in Aztec C.
X * See Scientific American, Sep 1985, p18-23.
X * 
X * Author:   Fons Rademakers, Nikhef-h/CERN
X * Version:  29-oct-1985
X * Revision:
X *
X */
X
X#asm
Xmain
X	dc.w  $6400		;ctl-enable, need time and locked in mem.
X	dc.w  0  		;update as often as possible
X	dc.w  $0001		;don't react on any specific event
X	dc.w  0			;no menu
X
X	dc.w  open_-main		;open routine
X	dc.w  nop_-main		;prime routine
X	dc.w  control_-main	;control routine
X	dc.w  nop_-main		;status routine
X	dc.w  close_-main 	;close routine
X
Xtitle_
X	dc.b  8
X	dc.b  "Crabs   "
X	ds    0          	;for alignment
X
X	public   _Uend_,_Dorg_,_Cend_
X
Xsave_
X	lea     main+(_Uend_-_Dorg_)+(_Cend_-main),a4	;set up globals
X	move.l  a0,Pbp_									;save pb pointer
X	move.l  a1,Dp_									;save DCE pointer
X	rts
X
Xrestore_
X	move.l  Pbp_,a0
X	rts
X#endasm
X
X#define	 _DRIVER
X#define  SMALL_MEM
X#include <quickdraw.h>
X#include <memory.h>
X#undef   SMALL_MEM
X#include <event.h>
X#include <pb.h>
X#include <desk.h>
X
X#define NULL  (0L)
X
X#define BASE1 512        /* Mac screen size in x direction */
X#define BASE2 342        /* Mac screen size in y direction */
X
X#define MAXVEL 8         /* max velocity of the crabs */
X#define CRABS 10         /* # of crabs */
X
X#define SP (*(struct storage **)Dp->dCtlStorage)
X
XDCEPtr  Dp;
XParmBlkPtr  Pbp;
X
XRect wind_rect = {0, 0, 0, 0};
X
Xstruct storage {
X   BitMap  crabmap[4];                /* the 4 crab bitmaps */
X	GrafPtr crabport;                  /* the crabs grafport */
X	Pattern gray;                      /* backgr fill pattern */
X	short   crabspace[4][16];          /* space for the 4 crab bitmaps */
X	short   portspace[54];             /* space for the crabport */
X	short   xvel[CRABS], yvel[CRABS];  /* the crabs velocity */
X	short   newdest[CRABS][2], olddest[CRABS][2]; /* the crabs pos. */
X	short   olddir[CRABS];             /* the direction the crab was going 
X*/
X	Boolean oldbackgr[CRABS];          /* flag to see if crab was on backgr 
X*/
X};
X
Xopen()
X{
X	register WindowPtr wp;
X	register struct DCE *dp;
X	register struct storage *sp;
X	extern char title[];
X	struct windowpeek {
X		GrafPort port;
X		int      windowKind;
X	};
X	short    x, i, dir;
X	Rect     destrect;
X
X	save();
X	dp = Dp;
X	if (dp->dCtlWindow == NULL) {
X		HLock(dp->dCtlStorage = NewHandle((long) sizeof(struct storage)));
X		sp = SP;
X		/* create an invisible window */
X		dp->dCtlWindow =         
X		wp = NewWindow(NULL, &wind_rect, title, FALSE, plainDBox, -1L, FALSE, 
XNULL);
X		((struct windowpeek *)wp)->windowKind = dp->dCtlRefNum;
X		/* allocate space for new crabport */
X		&sp->crabport->device = sp->portspace;
X		OpenPort(sp->crabport);
X		/* set the 4 crab bitmaps */
X		for(i = 0; i < 4; i++){
X			sp->crabmap[i].bounds.top    = 0;
X			sp->crabmap[i].bounds.left   = 0;
X			sp->crabmap[i].bounds.bottom = 8;
X			sp->crabmap[i].bounds.right  = 8;
X			sp->crabmap[i].rowBytes      = 2; /* needs to be even (to fit on a word) 
X*/
X			sp->crabmap[i].baseAddr      = &sp->crabspace[i][0];
X		}
X		StuffHex(sp->crabmap[0].baseAddr, "\P910008007E004200810081004200BD00");
X		StuffHex(sp->crabmap[1].baseAddr, "\PBD0042008100810042007E0010008900");
X		StuffHex(sp->crabmap[2].baseAddr, "\PB1004C0084008500860084004C00B100");
X		StuffHex(sp->crabmap[3].baseAddr, "\P8D00320021006100A100210032008D00");
X		/* gray pattern */
X		StuffHex(sp->gray, "\PAA55AA55AA55AA55");
X		/* set the start positions of the crabs and draw them */
X		x   = 0;
X		dir = 1;
X		for (i = 0; i < CRABS; i++){
X			sp->newdest[i][0] = x;
X			sp->newdest[i][1] = 0;
X			x += BASE1/CRABS;
X
X			destrect.left   = sp->newdest[i][0];
X			destrect.top    = sp->newdest[i][1];
X			destrect.right  = sp->newdest[i][0] + 8;
X			destrect.bottom = sp->newdest[i][1] + 8;
X			CopyBits(&sp->crabmap[dir], &sp->crabport->portBits,
X				     &sp->crabmap[dir].bounds, &destrect,
X					 srcCopy, NULL);
X			sp->olddir[i]     = dir;
X			sp->oldbackgr[i]  = FALSE;
X			sp->olddest[i][0] = sp->newdest[i][0];
X			sp->olddest[i][1] = sp->newdest[i][1];
X		}
X		/* set the background pattern to gray */
X		BackPat(sp->gray);
X
X		HUnlock(dp->dCtlStorage);
X	}
X	restore();
X	return(0);
X}
X
X
Xclose()
X{
X	register struct DCE *dp;
X
X	save();
X	dp = Dp;
X	/* get rid of the allocated space for the window and crabs */
X	DisposeWindow(dp->dCtlWindow);
X	dp->dCtlWindow = NULL;
X	DisposHandle(dp->dCtlStorage);
X	restore();
X	return(0);
X}
X
X
Xnop()
X{
X	return(0);
X}
X
X
X
X
Xcontrol()
X{
X	register struct DCE *dp;
X	register struct storage *sp;
X	short   x, y, i, j, dir;
X	Rect    grayrect, destrect;
X	Boolean backgr;
X
X	save();
X	dp = Dp;
X	HLock(dp->dCtlStorage);
X	sp = SP;
X	switch (Pbp->u.cp.csCode) {
X	case accRun:        /* time to move the crabs */
X		SetPort(sp->crabport);
X		for (i = 0; i < CRABS; i++) {
X			if (!sp->oldbackgr[i]) {
X				/* if crab was not on bakcgr, determine complete
X				 * new x and y velocities */
X	        	sp->xvel[i] = rand(-5, 5); 
X				sp->yvel[i] = rand(-5, 5);
X			} else {
X			    /* if crab was on backgr, increase or decrease the
X				 * x and y velocities only slightly */
X				if (sp->xvel[i] >= MAXVEL)
X					sp->xvel[i] += rand(-1, 0);
X				else if (sp->xvel[i] <= -MAXVEL)
X					sp->xvel[i] += rand(0, 1);
X				else 
X					sp->xvel[i] += rand(-1,1);
X
X				if (sp->yvel[i] >= MAXVEL)
X					sp->yvel[i] += rand(-1, 0);
X				else if (sp->yvel[i] <= -MAXVEL)
X					sp->yvel[i] += rand(0, 1);
X				else
X					sp->yvel[i] += rand(-1 ,1);
X			}
X			/* update the crab position */
X			sp->newdest[i][0] += sp->xvel[i];
X			sp->newdest[i][1] += sp->yvel[i];
X			/* make sure to remain within screen boundaries */
X			while ((sp->newdest[i][0] < 0) || (sp->newdest[i][0] > BASE1 - 8) ||
X			       (sp->newdest[i][1] < 0) || (sp->newdest[i][1] > BASE2 - 8)) {
X				sp->newdest[i][0] -= sp->xvel[i];
X				sp->newdest[i][1] -= sp->yvel[i];
X				sp->xvel[i] = rand(-5, 5);
X				sp->yvel[i] = rand(-5, 5);
X				sp->newdest[i][0] += sp->xvel[i];
X				sp->newdest[i][1] += sp->yvel[i];
X           	}
X			/* calculate new direction of crab */
X			if (abs(sp->yvel[i]) >= abs(sp->xvel[i]))
X				if (sp->yvel[i] <= 0) 
X					dir = 0;
X				else
X					dir = 1;
X			else
X				if (sp->xvel[i] >= 0)
X					dir = 2;
X				else
X					dir = 3;
X			/* erase the crab from the previous position, by drawing
X			 * it over with the gray background */
X			grayrect.left   = sp->olddest[i][0];
X			grayrect.top    = sp->olddest[i][1];
X			grayrect.right  = sp->olddest[i][0] + 8;
X			grayrect.bottom = sp->olddest[i][1] + 8;
X			EraseRect(&grayrect);
X
X			/* determine if the new position does occupy a
X			 * non gray site */
X			j = 0;
X			backgr = TRUE;
X			x = sp->newdest[i][0];
X			if (sp->xvel[i] > 0)   
X				y = sp->newdest[i][1] + 7;  /* scan only bottom line */
X			else                            /* of new crab position  */
X				y = sp->newdest[i][1];      /* or only top line      */
X			for (;x <= sp->newdest[i][0] + 7; x++) 
X				if (GetPixel(x, y)) j++;
X			if (j != 4) backgr = FALSE;
X			sp->oldbackgr[i] = backgr;
X
X			if (!backgr) {
X				/* if the site is not gray, make it gray and redraw
X			   	 * the crab in the previous position */
X				grayrect.left   = sp->newdest[i][0];
X				grayrect.top    = sp->newdest[i][1];
X				grayrect.right  = sp->newdest[i][0] + 8;
X				grayrect.bottom = sp->newdest[i][1] + 8;
X				EraseRect(&grayrect);
X				destrect.left   = sp->olddest[i][0];
X				destrect.top    = sp->olddest[i][1];
X				destrect.right  = sp->olddest[i][0] + 8;
X				destrect.bottom = sp->olddest[i][1] + 8;
X				dir             = sp->olddir[i];
X				CopyBits(&sp->crabmap[dir], &sp->crabport->portBits, 
X				         &sp->crabmap[dir].bounds, &destrect,
X						 srcCopy, NULL);
X				sp->newdest[i][0] = sp->olddest[i][0];
X				sp->newdest[i][1] = sp->olddest[i][1];
X			} else {
X				/* if the site is gray, draw the crab in the new
X				 * position */
X				destrect.left   = sp->newdest[i][0];
X				destrect.top    = sp->newdest[i][1];
X				destrect.right  = sp->newdest[i][0] + 8;
X				destrect.bottom = sp->newdest[i][1] + 8;
X				CopyBits(&sp->crabmap[dir], &sp->crabport->portBits,
X				         &sp->crabmap[dir].bounds, &destrect,
X						 srcCopy, NULL);
X				sp->olddest[i][0] = sp->newdest[i][0];
X				sp->olddest[i][1] = sp->newdest[i][1];
X				sp->olddir[i]     = dir;
X			}
X		}
X		break;  /* end case */
X	}
X	HUnlock(dp->dCtlStorage);
X	restore();
X	return(0);
X}
X
X
X/* Return random number uniformly distributed on [min,max].
X * Note that Random() delivers a value on [-32768,32767]. */
Xrand(min, max)
Xint min, max;
X{
X	float ran;
X
X	ran = (max - min + 1.0)*(float)abs(Random())/32768.0 + min;
X	return((ran < 0) ? --ran : ran);
X}
X
X
X/* Return absolute value of an integer */
Xabs(n)
Xint n;
X{
X	return((n > 0) ? n : -n);
X}
Eof_Shar_crabs.c
echo 'Original Sum -> 10467     9'
echo -n 'Current Sum  -> '
sum crabs.c
echo x - collapse.Hqx
sed 's/^X//' << 'Eof_Shar_collapse.Hqx' > collapse.Hqx
X(This file must be converted with BinHex 4.0)
X
X:#%0[E'aKF(0P!%4'58a%68p@!*!)"dEM(3#3"!%!N!-(#J!!"JS!N!-m!*$b"JC
XN!*!%!3#3!c!"0!%q!63""JK$EfaXBA"cC3"*qJAS+8Mra#P*rmK1G5"Xrm41G8j
X@rra)j``3BH)S,2r)*%4+UJ!HCJ!!S#4%,`S[2!#3!hT1ZJ95@%mNAb9!!"3[!%k
Xk"5CB6b4XrmJLDJ!8+K%N4#m+3UG#TdKXrla)H[q83QFr2!!#,ccrN!4#Cd+RU4-
XJ(bC!*&mP3!!H*%3hDJ!B!'`N45B&eV`!N!--*)-N45m5U'mN469m!"3!H#4&@)S
X[#NKk!#kSCL4&@)S[#UKm*%9BLLm+U*dN4#mU!"41ZJ5`@%p1Z[p#F!"-h`J`6Pj
X1G4""368e38%e08&"069"368e!%j@!!![#dkkr`iQE2r),bX!(UN83UX!(LmV!"4
X1ZJ4i@%p1Z[m!F!!QAdjH6R919J!!F!"1ANje6PErl%MR#""1Z[l8*Qcrb#mV!"4
X1ZJ3d@%mNE2r))QS!&#J4*'cra$!U!"TJ!!$H*%3[%UKc*%3-DJ&@!(KZ!!$#2A`
X!!Irm$'i!"rrmEJ!!P%+RU0JJ(be!rq`r2!)!6VS#,&4228$rrNKZrr!r,[rq*%3
Xr+J"i2c`#!$BZrrl@I!#@2`01ZJ1Q@%mr!$mm!9BN4$mU!(K1ZJ#5@%mr!+LR2c`
X!!cmmrre1ZJ#!@%mp32rk2c`!"$mm!!&KEPK228$rq%KZrr!r,[rk2blrq#mZrqb
XSlbmZrqbSf9*ZrraJ!2pQ3QFN4$mU!(LSNcmm!J!N4$mU!(LSN54%8QS!H'!)*%3
XeI!!8!(KJ#*!!I!""C`$r(LmV!"41ZJ-k@%p1Z[h-F!"-h`J36Pj1G8j@rr`f,J!
X+PQi!#$m$,`p)E2r-2c`J$URV9%pJ#$r`!*!'5(VrpNKXrm`r2!J!UHY46dKXrma
X)E`!%2c`)%+RV3QHSB6!I2`"1ZJ*m9%mr!#m25'crc$mm)!kTke425&G)E2r@2c`
X)$URV8%p)E2r-5'creMmm!!5Tkf!)31!!N!C)H[rf5'creMmm#!DTkcBZ!!Jr!bm
X25'crc$mm)!kTke425'crc%KXrpBr2!!!UHY)E2r@5'lrr$mm%"#TkdKZrra)E2r
X-2c`3$URVB!J!N!K)H[rf5'crc$mm#!LTkfa%5'lrr%KXrm`r2"!1UHYJ#,r`!*!
X'5(VrpNKXrm`r2!J!UHY)E2r-5'lrr$mm%"#TkdKXrma)E2rJ2c`!%+RVB!j)E[r
Xm5'cri$mm%!kTke925'cri$mm!"DTkdKXrq")E`!%2c`J%+RV0Km`!djH6R919[r
Xi3QHSB6!I2`"1ZJ&D9%mr!#m25'crc$mm)!kTke42B!K!hrr!!*!%5(VrpNKXrm`
Xr2!J'UHY)E2r-5'lrr$mm%"#TkcBZ!!Jr!bm25'crc$mm)!kTke425'lrr%KXrpB
Xr2"!1UHY)E2r@5'crc$mm!!5Tkf!)2r!!N!C)H[rf5'creMmm#!kTkdKZrra)E2r
XU2c`3$URV5'crkNKXrpBr2!!#UHY)E2r@5'crc$mm!!5Tkf!)3!#3"dKkrrC)E2r
X-2c`)"+RV5'crc%KZrrJr2"!3UHY)E[rm5'crc$mm%!kTkf!)2q!!N!C)H[rf5'c
Xrc$mm#!LTkf8`0Li!#$m$,`p)E2r-2c`J$URV9%p)E[ri5'crc$mm%!+TkdKXrma
X)E[ri2c`3%+RV5'lrq%KXrq!r2"!1UHY96dKXrq!r2!!@UHY)E2rJ5'm!"$mm)"#
XTkcBI-!01ANje6PB!!!aZ!*!$#'m'-#i!#'!'-#i!#%4!6Pj1G8j@!!!f,J!)YQi
X!#Qm'-#i!#'!%-#i!#NjH6R919J!!0Li!#,CZ!!TX"M!Z!!KJ"$!Z!!T1ANje)'m
X!"+!T6[S!+L"[!!5J+Nlk!#!JE`!%S#01qJ!@)#m!"+%L6[S!!N2YrribJ#!)6R9
X$lIrq-S"1G3#3A4`!-J!!4&*@8J#3!`S!(`!!)!#3"`N!3fpXE'&`Ff8qp!:
Eof_Shar_collapse.Hqx
echo 'Original Sum -> 45260     3'
echo -n 'Current Sum  -> '
sum collapse.Hqx
echo x - collapse.c
sed 's/^X//' << 'Eof_Shar_collapse.c' > collapse.c
X/* --------------- Collapse --------------- 
X *
X * Make the windows on the screen collapse.
X * Written in Aztec C.
X * 
X * Author:   Fons Rademakers, Nikhef-h/CERN
X * Version:  29-oct-1985
X * Revision:
X *
X */
X
X#asm
Xmain
X	dc.w  $6400		;ctl-enable, need time and locked in mem.
X	dc.w  0  		;update as often as possible
X	dc.w  $0001		;don't react on any specific event
X	dc.w  0			;no menu
X
X	dc.w  open_-main	;open routine
X	dc.w  nop_-main		;prime routine
X	dc.w  control_-main	;control routine
X	dc.w  nop_-main		;status routine
X	dc.w  close_-main 	;close routine
X
Xtitle_
X	dc.b  8
X	dc.b  "Collapse"
X	ds    0          	;for alignment
X
X	public   _Uend_,_Dorg_,_Cend_
X
Xsave_
X	lea     main+(_Uend_-_Dorg_)+(_Cend_-main),a4	;set up globals
X	move.l  a0,Pbp_					;save pb pointer
X	move.l  a1,Dp_					;save DCE pointer
X	rts
X
Xrestore_
X	move.l  Pbp_,a0
X	rts
X#endasm
X
X#define	 _DRIVER
X#define  SMALL_MEM
X#include <quickdraw.h>
X#include <memory.h>
X#undef   SMALL_MEM
X#include <event.h>
X#include <pb.h>
X#include <desk.h>
X
X#define NULL  (0L)
X
X#define BASE1 512        /* Mac screen size in x direction */
X#define BASE2 342        /* Mac screen size in y direction */
X
X#define SP (*(struct storage **)Dp->dCtlStorage)
X
XDCEPtr  Dp;
XParmBlkPtr  Pbp;
X
XRect wind_rect = {0, 0, 0, 0};
X
Xstruct storage {
X	GrafPtr flowport;            /* the flow grafport */
X	Pattern gray;
X	short   portspace[54];       /* space for the flowport */
X	short   y;
X};
X
Xopen()
X{
X	register WindowPtr wp;
X	register struct DCE *dp;
X	register struct storage *sp;
X	extern char title[];
X	struct windowpeek {
X		GrafPort port;
X		int      windowKind;
X	};
X	short    x, i;
X
X	save();
X	dp = Dp;
X	if (dp->dCtlWindow == NULL) {
X		HLock(dp->dCtlStorage = NewHandle((long) sizeof(struct storage)));
X		sp = SP;
X		/* create an invisible window */
X		dp->dCtlWindow =         
X		wp = NewWindow(NULL, &wind_rect, title, FALSE, plainDBox, -1L, FALSE, 
XNULL);
X		((struct windowpeek *)wp)->windowKind = dp->dCtlRefNum;
X		/* allocate space for new flowport */
X		&sp->flowport->device = sp->portspace;
X		OpenPort(sp->flowport);
X		/* set start y value */
X		sp->y = 20;
X		/* gray pattern */
X		StuffHex(sp->gray, "\PAA55AA55AA55AA55");
X		/* set the background pattern to gray */
X		BackPat(sp->gray);
X		/* set the pen pattern to gray */
X		PenPat(sp->gray);
X
X		HUnlock(dp->dCtlStorage);
X	}
X	restore();
X	return(0);
X}
X
X
Xclose()
X{
X	register struct DCE *dp;
X
X	save();
X	dp = Dp;
X	/* get rid of the allocated space for the window */
X	DisposeWindow(dp->dCtlWindow);
X	dp->dCtlWindow = NULL;
X	DisposHandle(dp->dCtlStorage);
X	restore();
X	return(0);
X}
X
X
Xnop()
X{
X	return(0);
X}
X
X
X
X
Xcontrol()
X{
X	register struct DCE *dp;
X	register struct storage *sp;
X	short     x, i;
X	short     xdest, ydest;
X	Rect      destrect;
X	RgnHandle dummyrgn;
X
X	save();
X	dp = Dp;
X	HLock(dp->dCtlStorage);
X	sp = SP;
X	switch (Pbp->u.cp.csCode) {
X	case accRun:        /* time to flow the screen */
X		SetPort(sp->flowport);
X		if (sp->y <= BASE2) {
X			for (i = 1; i <= 7; i++) {
X				dummyrgn = NewRgn();
X				x = jrand(BASE1);
X				SetRect(&destrect, x, sp->y, min(x+150, BASE1), rand(sp->y, BASE2));
X				xdest = rand(-3, 3);
X				ydest = rand(1, 4);
X				ScrollRect(&destrect, xdest, ydest, dummyrgn);
X				DisposeRgn(dummyrgn);
X			}
X			MoveTo(0, sp->y);
X			LineTo(BASE1, sp->y);
X			sp->y++;
X		} else
X			sp->y = 20;
X		break;  /* end case */
X	}
X	HUnlock(dp->dCtlStorage);
X	restore();
X	return(0);
X}
X
X
X/* Return random number uniformly distributed on [min,max].
X * Note that Random() delivers a value on [-32768,32767]. */
Xrand(min, max)
Xint min, max;
X{
X	float ran;
X
X	ran = (max - min + 1.0)*(float)abs(Random())/32768.0 + min;
X	return((ran < 0) ? --ran : ran);
X}
X
X
X/* Return random number, on base [0, base>, with quadratic emphasis
X * round base/2. */
Xjrand(base)
Xint base;
X{
X	float x, ran;
X
X	x = (float)abs(Random())/32767.0;   /* random number uniformly on [0, 
X1> */
X	ran = 2.0*(float)base*x*(1.0 - x);
X	if (x >= 0.5)
X		ran = (float)base - ran;
X	return(ran);
X}
X
X
X
X/* Return absolute value of an integer */
Xabs(n)
Xint n;
X{
X	return((n > 0) ? n : -n);
X}
X
X
X
X/* Return the max integer */
Xmax(a, b)
Xint a, b;
X{
X	return((a > b) ? a : b);
X}
X
X
X/* Return the min integer */
Xmin(a, b)
Xint a, b;
X{
X	return((a < b) ? a : b);
X}
X
Eof_Shar_collapse.c
echo 'Original Sum -> 36199     5'
echo -n 'Current Sum  -> '
sum collapse.c
echo x - flow.Hqx
sed 's/^X//' << 'Eof_Shar_flow.Hqx' > flow.Hqx
X(This file must be converted with BinHex 4.0)
X
X:"%CXEhF!4%C*6%406eB!N!J(-,P#!*!%!3#3!`Ei!!!&q!#3!cJ!N2)&p'3!N!3
X"!*!$,!%Q!6!"*J$i"%CXEhF!5IS&fLP)rm3T5Ir)6R8JE2r%6R919[rm51F-%'(
XL+#crb#4%5US!(QB!!*BN4#m+,c`!N!0k6VS&4&K2*&mP3!!8,`"1ZJ8B@%mNE2r
X))QS!&#S4*%3[#N+R3UG)E2qm5(VrQ%*R2c`!!Lmmrj!%3QG#TkN6)"mQ3#4I*8!
X!(L4%0fS!'!"X*%8Q"GDm!*!$$#5$*%8[%UK[*%9#DJ"i*%9BLLm+5(S!*UKQ*%9
XBLLm+U(`N4#mU!"41ZJ5X@%p1Z[p-F!"-h`J`6Pj1G4"'N"!!6PB!!#m,6VVr'#C
XXrmJ[+`!HU44#U`!H,bX!&%kk"(4B6dkkr`T`!#CI6Pj1G8j@!!"`!%jH6R919[r
XX51F)%%kkrYiQE2r),bX!&%kk"$"B6b4XrmJLDJ!8+"%NE2r%-#S!'Q!!!0SN4#m
X5U(-N4!aU!9B!H'i!!-!pI!!"rr`-EJ!(rraZ!!#53UHSf#!I,8$rl$mm!J"1ZJ)
XS9%mp32rq5'lrm$mZrriN4$mU!(Jr2!)!0LlrrYCm!*Br!dkk!k*B6cm!2c`"9L4
X%2bS!H%kk!)jB6cm!U+Fr2!!$2ccrr@&m@%mp32rk2c`!"$mm!!&KE&K228$rq%K
XZrr!r,[rk2blrq#mZrqbSlbmZrqbSf9*ZrraJ!2pS3QFN4$mU!(LSNcmm!J!N4$m
XU!(LSN54%8QS!H'!'*%4#DJ"iB!L3!(`!3@F!rb)[+`!86VS$1PK26VVpfR!!60m
X)%%jH6R919[rm0Li!#TCZ!!Jr!bm25'crc$mm)!kTke42B!Jrm!#3"NKkrrC)E2r
X-2c`)!+RV88p)E2r-5'm!"$mm#"#Tkd*RU'%`(cm!6VS#I&422`![$dKXrm`r2#!
X1UHY86dKA5'creMmm#!kTke"25'crc%KXrpBr2!!%UHYJ#%$J!*!'5(VrpNKXrpB
Xr2!J'UHXf,J!)2`-[$dKXrm`r2#!1UHY86dKXrma)E2r@2c`!!+RV5'creNKZrr`
Xr2"!3UHY)E[rm5'crc$mm%!kTkf!)!*!)5(VrpNKXrm`r2!J)UHYX4%KZrra)E2r
X-2c`3$URVB!Lrm!#3"NKkrrC)E2r-2c`)!+RV5'crc%KZrr`r2"!3UHY)E2r-5'c
Xri$mm!"#Tkf!15'lrr%KXrq!r2"!1UHY96dKXrq!r2!!@UHY)E2rJ5'm!"$mm)"#
XTkcBI-!01ANje6PErq%*RU'%`(cm!6VS"@P422`![$dKXrm`r2#!1UHY86f!)31!
X!N!C)H[rf5'crc$mm#!DTkdKXrma)E[rm2c`3%+RV0Li!#$m$,`p)E2r-2c`J$UR
XV9%p)E[rm5'creMmm%!kTkdKXrpC)E2r-2c`!"+RVB!Jrm!#3"NKkrrC)E2r@2c`
X)$URV5'lrr%KXrqSr2"!1UHY)E2rU5'creMmm!!+TkdKXrpC)E2r-2c`!"+RVB!K
X!!*!(5(VrpNKXrm`r2!J%UHY)E2r-5'lrq$mm%"#TkdKZrra)E2r-2c`3$URVB!J
Xri!#3"NKkrrC)E2r-2c`)#+RVC6!f,J!)2`-[$dKXrm`r2#!1UHY86dKZrrK)E2r
X-2c`3!URV5'crc%KZrrJr2"!3UHY)E[ri5'cri$mm%!kTke925'cri$mm!"DTkdK
XXrq")E`!%2c`J%+RV0Km`!djH6R919J!!$'i!N!-)E`B`,J!)B!B`,J!)4%"1ANj
Xe6PB!!$BZ!!LfEJ!+E`B`,J!)B!3`,J!+6Pj1G8j@!!!f,J!)YQi!#Q`'-#i!#'!
X%-#i!#NjH6R8JE`!%S#P1qJ!U)'m!"+!U6[S!)#"[!!5J)dlk!"BJ,`!%S5*1qJ!
X#3qhrrM+!)!K1G82YrribJ%je!*"G(!!b!!"%8PC5!*!$#J!I!!!J!*!("3"'E'p
Xhe-`:
Eof_Shar_flow.Hqx
echo 'Original Sum -> 38094     3'
echo -n 'Current Sum  -> '
sum flow.Hqx
echo x - flow.c
sed 's/^X//' << 'Eof_Shar_flow.c' > flow.c
X/* ----------------- flow ----------------- 
X *
X * Make the Mac screen flow away.
X * Written in Aztec C.
X * 
X * Author:   Fons Rademakers, Nikhef-h/CERN
X * Version:  29-oct-1985
X * Revision:
X *
X */
X
X#asm
Xmain
X	dc.w  $6400		;ctl-enable, need time and locked in mem.
X	dc.w  0  		;update as often as possible
X	dc.w  $0001		;don't react on any specific event
X	dc.w  0			;no menu
X
X	dc.w  open_-main		;open routine
X	dc.w  nop_-main		;prime routine
X	dc.w  control_-main	;control routine
X	dc.w  nop_-main		;status routine
X	dc.w  close_-main 	;close routine
X
Xtitle_
X	dc.b  4
X	dc.b  "Flow"
X	ds    0          	;for alignment
X
X	public   _Uend_,_Dorg_,_Cend_
X
Xsave_
X	lea     main+(_Uend_-_Dorg_)+(_Cend_-main),a4	;set up globals
X	move.l  a0,Pbp_									;save pb pointer
X	move.l  a1,Dp_										;save DCE pointer
X	rts
X
Xrestore_
X	move.l  Pbp_,a0
X	rts
X#endasm
X
X#define	 _DRIVER
X#define  SMALL_MEM
X#include <quickdraw.h>
X#include <memory.h>
X#undef   SMALL_MEM
X#include <event.h>
X#include <pb.h>
X#include <desk.h>
X
X#define NULL  (0L)
X
X#define BASE1 512        /* Mac screen size in x direction */
X#define BASE2 342        /* Mac screen size in y direction */
X
X#define SP (*(struct storage **)Dp->dCtlStorage)
X
XDCEPtr  Dp;
XParmBlkPtr  Pbp;
X
XRect wind_rect = {0, 0, 0, 0};
X
Xstruct storage {
X	GrafPtr flowport;            /* the flow grafport */
X	Pattern black;
X	short   portspace[54];       /* space for the flowport */
X	short   y;
X};
X
Xopen()
X{
X	register WindowPtr wp;
X	register struct DCE *dp;
X	register struct storage *sp;
X	extern char title[];
X	struct windowpeek {
X		GrafPort port;
X		int      windowKind;
X	};
X	short    x, i;
X
X	save();
X	dp = Dp;
X	if (dp->dCtlWindow == NULL) {
X		HLock(dp->dCtlStorage = NewHandle((long) sizeof(struct storage)));
X		sp = SP;
X		/* create an invisible window */
X		dp->dCtlWindow =         
X		wp = NewWindow(NULL, &wind_rect, title, FALSE, plainDBox, -1L, FALSE, 
XNULL);
X		((struct windowpeek *)wp)->windowKind = dp->dCtlRefNum;
X		/* allocate space for new flowport */
X		&sp->flowport->device = sp->portspace;
X		OpenPort(sp->flowport);
X		/* set start y value */
X		sp->y = 0;
X		/* black pattern */
X		StuffHex(sp->black, "\PFFFFFFFFFFFFFFFF");
X		/* set the background pattern to black */
X		BackPat(sp->black);
X
X		HUnlock(dp->dCtlStorage);
X	}
X	restore();
X	return(0);
X}
X
X
Xclose()
X{
X	register struct DCE *dp;
X
X	save();
X	dp = Dp;
X	/* get rid of the allocated space for the window */
X	DisposeWindow(dp->dCtlWindow);
X	dp->dCtlWindow = NULL;
X	DisposHandle(dp->dCtlStorage);
X	restore();
X	return(0);
X}
X
X
Xnop()
X{
X	return(0);
X}
X
X
X
X
Xcontrol()
X{
X	register struct DCE *dp;
X	register struct storage *sp;
X	short     x, i;
X	short     xdest, ydest;
X	Rect      destrect;
X	RgnHandle dummyrgn;
X
X	save();
X	dp = Dp;
X	HLock(dp->dCtlStorage);
X	sp = SP;
X	switch (Pbp->u.cp.csCode) {
X	case accRun:        /* time to flow the screen */
X		SetPort(sp->flowport);
X		if (sp->y <= BASE2) {
X			for (i = 1; i <= 7; i++) {
X				dummyrgn = NewRgn();
X				x = jrand(BASE1);
X				SetRect(&destrect, x, sp->y, min(x+150, BASE1), rand(sp->y, BASE2));
X				xdest = rand(-3, 3);
X				ydest = rand(1, 4);
X				ScrollRect(&destrect, xdest, ydest, dummyrgn);
X				DisposeRgn(dummyrgn);
X			}
X			MoveTo(0, sp->y);
X			LineTo(BASE1, sp->y);
X			sp->y++;
X		} else
X			sp->y = 0;
X		break;  /* end case */
X	}
X	HUnlock(dp->dCtlStorage);
X	restore();
X	return(0);
X}
X
X
X/* Return random number uniformly distributed on [min,max].
X * Note that Random() delivers a value on [-32768,32767]. */
Xrand(min, max)
Xint min, max;
X{
X	float ran;
X
X	ran = (max - min + 1.0)*(float)abs(Random())/32768.0 + min;
X	return((ran < 0) ? --ran : ran);
X}
X
X
X/* Return random number, on base [0, base>, with quadratic emphasis
X * round base/2. */
Xjrand(base)
Xint base;
X{
X	float x, ran;
X
X	x = (float)abs(Random())/32768.0;   /* random number uniformly on [0, 
X1> */
X	ran = 2.0*(float)base*x*(1.0 - x);
X	if (x >= 0.5)
X		ran = (float)base - ran;
X	return(ran);
X}
X
X
X
X/* Return absolute value of an integer */
Xabs(n)
Xint n;
X{
X	return((n > 0) ? n : -n);
X}
X
X
X
X/* Return the max integer */
Xmax(a, b)
Xint a, b;
X{
X	return((a > b) ? a : b);
X}
X
X
X/* Return the min integer */
Xmin(a, b)
Xint a, b;
X{
X	return((a < b) ? a : b);
X}
X
Eof_Shar_flow.c
echo 'Original Sum -> 38940     5'
echo -n 'Current Sum  -> '
sum flow.c
exit