[net.micro.atari16] ST Calendar Desk Accessory

jwt@atari.UUcp (Jim Tittsler) (04/24/86)

Here is a shar file containing the source for a simple "sort of
perpetual" calendar desk accessory.

#! /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 the files:
#	cal.c string.c
echo x cal.c
sed 's/^X//' > cal.c << 'xEOF'
X/*
X * cal.c -- simple TOS desktop calendar accessory
X *
X *	provides a "perpetual" (well, really 1980-2009) calendar page display
X *	uses vertical scroll bar:  arrows move by month, shaded area by year
X *
X *	link68 cal.68k=accstart,cal,string,osbind,vdibind,aesbind
X *	relmod cal
X *	ren cal.prg cal.acc (must be DESKN.ACC in early TOS)
X *
X *	- a further experiment into the realm of writing a desk accessory
X *	This was a personal experiment to learn more about desk accessories.
X *	It may be freely distributed, on an "as-is" basis.  Comments and
X *	suggestions are welcome.  This is NOT an official, supported,
X *	Atari product.  
X *	Jim Tittsler, Atari Corp.
X *
X *	15Oct85	jwt	v0.01	hacked from WATCH accessory
X *	17Jan86	jwt	v0.02	set first displayed page at OPEN time,
X *				  not init time
X *				added Day of Week string
X *	21Jan86	jwt	v0.03	use reverse video to highlight current date
X *	30Jan86	jwt	v0.04	reduce height & width of highlight in high res
X *	18Apr86	jwt	v0.05	"reopen" at same place as last close
X *	24Apr86	jwt	v1.00	distribute
X */
X
Xstatic char id[] = "@(#)CAL.ACC V1.00  jwt@atari";
X
X/* #define	DEBUG 1		*/
X/* #define	DDEVICE 2	*/
X#define	REVHIGHLIGHT 1
X
X#include "obdefs.h"
X#include "define.h"
X#include "gemdefs.h"
X#include "osbind.h"
X
X#define WI_KIND		(MOVER|CLOSER|NAME|UPARROW|DNARROW|VSLIDE)
X
X#define NO_WINDOW (-1)
X
X#define	AR_UPPG		0
X#define	AR_DNPG		1
X#define	AR_UPLN		2
X#define	AR_DNLN		3
X
X#define	STRINGWIDTH	22
X#define	BLANKSTRING	"                      "
X#define	CALLINES	8
X#define	DAYOFWEEKSTRING	" Sn  M Tu  W Th  F Sa "
X#define LENDOWS		STRINGWIDTH
X
X#define	YEAROFFSET	1980
X#define	BASEYEAR	1980
X#define	CALLEN		30
X#define	LASTYEAR	(BASEYEAR+CALLEN-1)
X
X#define MIN_WIDTH  (STRINGWIDTH*gl_wchar)
X#define MIN_HEIGHT (CALLINES*gl_hchar+1)
X
X#define	INIT_X		100
X#define	INIT_Y		50
X#define	INIT_WIDTH	MIN_WIDTH
X#define	INIT_HEIGHT	MIN_HEIGHT
X
Xextern int	gl_apid;
X
Xint	year,month,day;
Xint	curyr,curmo,curday;
X
Xint	initx = INIT_X;
Xint	inity = INIT_Y;
X
Xint	lastdate = -1;	/* last DOS date */
Xint	washighlighted;
Xint	hires;		/* 1 if in high resolution */
Xchar	dtoabuf[10];
Xchar	calstring[CALLINES][(STRINGWIDTH+1)];
Xchar	*months[]= {"January", "February", "March", "April",
X		"May", "June", "July", "August",
X		"September", "October", "November", "December"};
Xint	daypermon[]= {31, 28, 31, 30,
X		31, 30, 31, 31,
X		30, 31, 30, 31};
X
Xint	gl_hchar;
Xint	gl_wchar;
Xint	gl_wbox;
Xint	gl_hbox;	/* system sizes */
X
Xint	menu_id ;	/* our menu id */
X
Xint 	phys_handle;	/* physical workstation handle */
Xint 	handle;		/* virtual workstation handle */
Xint	wi_handle;	/* window handle */
Xint	top_window;	/* handle of topped window */
X
Xint	xwork,ywork,hwork,wwork;	/* work area */
X
Xint	msgbuff[8];	/* event message buffer */
Xint	keycode;	/* keycode returned by event-keyboard */
Xint	mx,my;		/* mouse x and y pos. */
Xint	ret;		/* dummy return variable */
X
Xint	hidden;		/* current state of cursor */
X
Xint	contrl[12];
Xint	intin[128];
Xint	ptsin[128];
Xint	intout[128];
Xint	ptsout[128];	/* storage wasted for idiotic bindings */
X
Xint work_in[11];	/* Input to GSX parameter array */
Xint work_out[57];	/* Output from GSX parameter array */
Xint pxyarray[10];	/* input point array */
X
X/*page*/
Xchar *dtoa( i, fwidth ) register int i,fwidth; {
Xregister char *ptr,*lptr;
Xregister int cnt;
Xchar tbuf[6];
X
X	ptr = dtoabuf;
X
X	if (i < 0) {
X		*ptr++ = '-';
X		--fwidth;
X		i = -i;
X	}
X
X	lptr = tbuf;
X	cnt = 0;
X
X	do {
X		*lptr++ = (i % 10)+0x30;
X		++cnt;
X	} while ( (i /= 10) && (cnt<fwidth) );
X
X	if (i)	/* did we exceed the field width? */
X		for(cnt=0; cnt<fwidth; ++cnt) *ptr++ = '*';
X	else {
X		for(i=0; i<(fwidth-cnt); ++i) *ptr++ = ' ';
X		while(cnt--) *ptr++ = *--lptr;
X	}
X
X	*ptr='\0';	/* null terminate the string */
X
X	return dtoabuf;
X}
X
X/*page*/
Xhide_mouse()
X{
X	if(! hidden){
X		graf_mouse(M_OFF,0x0L);
X		hidden=TRUE;
X	}
X}
X
Xshow_mouse()
X{
X	if(hidden){
X		graf_mouse(M_ON,0x0L);
X		hidden=FALSE;
X	}
X}
X
Xopen_vwork() {
Xint i;
X	for(i=0;i<10;work_in[i++]=1);
X	work_in[10]=2;		/* use device coordinates */
X	handle=phys_handle;
X	v_opnvwk(work_in,&handle,work_out);
X}
X
Xset_clip(x,y,w,h) int x,y,w,h; {
Xint clip[4];
X	clip[0]=x;
X	clip[1]=y;
X	clip[2]=x+w-1;
X	clip[3]=y+h-1;
X	vs_clip(handle,1,clip);
X}
X
Xopen_window() {
Xint xbord,ybord,wbord,hbord;
X
X	wind_calc(WC_BORDER,WI_KIND,	/* WC_BORDER */
X		initx,inity,INIT_WIDTH,INIT_HEIGHT,
X		&xbord, &ybord, &wbord, &hbord);
X	wi_handle=wind_create(WI_KIND,xbord,ybord,
X		wbord,hbord);
X	wind_set(wi_handle, WF_NAME," CALENDAR ",0,0);
X	wind_set(wi_handle, WF_VSLSIZE, -1, 0, 0, 0);
X	wind_set(wi_handle, WF_VSLIDE,
X		(int)((1000L*((year-BASEYEAR)*12L+month))/(CALLEN*12)),0,0,0);
X	graf_growbox(0,0,gl_wbox,gl_hbox,
X		xbord,ybord,wbord,hbord);
X	wind_open(wi_handle,xbord,ybord,
X		wbord,hbord);
X	wind_get(wi_handle,WF_WORKXYWH,&xwork,&ywork,&wwork,&hwork);
X}
X
Xdo_redraw(complete,xc,yc,wc,hc)
Xint complete;
Xint xc,yc,wc,hc;
X{
XGRECT t1,t2;
X
X	hide_mouse();
X	wind_update(TRUE);
X	t2.g_x=xc;
X	t2.g_y=yc;
X	t2.g_w=wc;
X	t2.g_h=hc;
X	wind_get(wi_handle,WF_FIRSTXYWH,&t1.g_x,&t1.g_y,&t1.g_w,&t1.g_h);
X	while (t1.g_w && t1.g_h) {
X	  if (rc_intersect(&t2,&t1)) {
X	    set_clip(t1.g_x,t1.g_y,t1.g_w,t1.g_h);
X	    draw_calendar(complete);
X	  }
X	  wind_get(wi_handle,WF_NEXTXYWH,&t1.g_x,&t1.g_y,&t1.g_w,&t1.g_h);
X	}
X	wind_update(FALSE);
X	show_mouse();
X}
X
X/*page*/
Xmain() {
Xlong ikbdtime;
X
X	appl_init();
X	phys_handle=graf_handle(&gl_wchar,&gl_hchar,&gl_wbox,&gl_hbox);
X	gl_hchar++;
X	menu_id=menu_register(gl_apid,"  Calendar");
X
X	/* use the ikbd's version of time if it looks valid */
X	/* i.e., month is nonzero */
X	if((ikbdtime = Gettime()) &0x01E00000L) {
X		Tsetdate((int)(ikbdtime>>16));
X		Tsettime((int)(ikbdtime&0xFFFFL));
X	}
X	wi_handle=NO_WINDOW;
X	hidden=FALSE;
X
X	hires = (Getrez() == 2);	/* hires = 1 if in high res */
X	multi();
X}
X
X/*page*/
Xmulti()
X{
Xint event;
X#ifdef DEBUG
Xint idebug;
X#endif
X
X      while (TRUE) {
X	event = evnt_multi(MU_MESAG | MU_KEYBD | MU_TIMER,
X			1,1,0,
X			0,0,0,0,0,
X			0,0,0,0,0,
X			msgbuff,10000,0,&mx,&my,&ret,&ret,&keycode,&ret);
X
X	if((lastdate != Tgetdate()) && (wi_handle != NO_WINDOW)){
X		lastdate = Tgetdate();
X		curday = lastdate & 0x1F;
X		curmo = (lastdate >> 5) & 0xF;
X		curyr = (lastdate >> 9)+YEAROFFSET;
X		if(((year==curyr)&&(month==curmo)) || washighlighted)
X			do_redraw(FALSE,xwork,ywork,wwork,hwork);
X	}
X
X	wind_update(TRUE);
X	wind_get(wi_handle,WF_TOP,&top_window,&ret,&ret,&ret);
X
X	if (event & MU_MESAG) {
X#ifdef DEBUG
X	  putsaux("Message: ");
X	  for (idebug=0; idebug<8; ++idebug) {
X		putdaux(msgbuff[idebug]);
X		putcaux(' ');
X	  }
X	  putcaux(0x0D); putcaux(0x0A);
X#endif
X
X	  switch (msgbuff[0]) {
X
X	  case WM_REDRAW:
X	    if (msgbuff[3] == wi_handle)
X	      do_redraw(TRUE,msgbuff[4],msgbuff[5],msgbuff[6],msgbuff[7]);
X	    break;
X
X	  case WM_NEWTOP:
X	  case WM_TOPPED:
X	    if (msgbuff[3] == wi_handle){
X	      wind_set(wi_handle,WF_TOP,0,0,0,0);}
X	    break;
X
X	  case AC_CLOSE:
X	    if((msgbuff[3] == menu_id)&&(wi_handle != NO_WINDOW)){
X	      v_clsvwk(handle);
X	      wi_handle = NO_WINDOW;
X	    }
X	    break;
X
X	  case WM_CLOSED:
X	    if(msgbuff[3] == wi_handle){
X	      wind_close(wi_handle);
X	      graf_shrinkbox(0,0,gl_wbox,gl_hbox,xwork,ywork,wwork,hwork);
X	      wind_delete(wi_handle);
X	      v_clsvwk(handle);
X	      wi_handle = NO_WINDOW;
X	    }
X	    break;
X
X	  case WM_MOVED:
X	    if(msgbuff[3] == wi_handle){
X		wind_set(wi_handle,WF_CURRXYWH,
X			msgbuff[4],msgbuff[5],msgbuff[6],msgbuff[7]);
X		wind_get(wi_handle,WF_WORKXYWH,&xwork,&ywork,&wwork,&hwork);
X		initx = xwork;  inity = ywork;
X	    }
X	    break;
X
X	  case AC_OPEN:
X	    if (msgbuff[4] == menu_id){
X	      if(wi_handle == NO_WINDOW){
X
X		if (lastdate != Tgetdate()){
X		  lastdate = Tgetdate();
X		  curday = day = lastdate & 0x1F;
X		  curmo = month = (lastdate >> 5) & 0xF;
X		  curyr = year = (lastdate >> 9)+YEAROFFSET;
X		  makecalpage(year, month, day);
X		}
X		open_vwork();
X	        open_window();
X	      }
X	      else	/* if already opened, for user convenience */
X	        wind_set(wi_handle,WF_TOP,0,0,0,0);
X	    }
X	    break;
X
X	  case WM_ARROWED:
X	    switch(msgbuff[4]){
X		case AR_UPLN:  if(--month) break;
X				month=12;
X				if(--year<BASEYEAR) {
X					year = BASEYEAR;
X					month = 1;
X				}
X				break;
X		case AR_UPPG:  if(--year<BASEYEAR) year = BASEYEAR; break;
X		case AR_DNLN:  if(++month<13) break;
X				month=1;
X				if(++year>LASTYEAR) {
X					year = LASTYEAR;
X					month = 12;
X				}
X				break;
X		case AR_DNPG:  if(++year>LASTYEAR) year = LASTYEAR; break;
X	    } /* switch(msgbuff[4]) */
X	    makecalpage(year,month,-1);
X	    do_redraw(FALSE,xwork,ywork,wwork,hwork);
X	    wind_set(wi_handle, WF_VSLIDE,
X		(int)((1000L*((year-BASEYEAR)*12L+month))/(CALLEN*12)),0,0,0);
X	    break;
X
X	  case WM_VSLID:
X	    wind_set(wi_handle, WF_VSLIDE, msgbuff[4], 0, 0, 0);
X	    month = (int)(((long)msgbuff[4]*(CALLEN*12-1))/1000L);
X	    year = (month/12)+BASEYEAR;
X	    month = (month % 12)+1;
X	    makecalpage(year,month,-1);
X	    do_redraw(FALSE,xwork,ywork,wwork,hwork);
X	    break;
X
X	  } /* switch (msgbuff[0]) */
X	}
X
X	wind_update(FALSE);
X
X      } /* while (TRUE) */
X
X}
X
Xdraw_calendar(complete) int complete; {
Xint temp[4];
Xint i;
X
X	if (complete || washighlighted){
X		vsf_interior(handle,1);		/* solid */
X		vsf_color(handle,0);
X		temp[0]=xwork;
X		temp[1]=ywork;
X		temp[2]=xwork+wwork-1;
X		temp[3]=ywork+hwork-1;
X		v_bar(handle,temp);		/* blank the interior */
X	}
X
X	vst_color(handle, 1);
X
X	for(i=0; i<CALLINES; ++i)
X		v_gtext(handle, xwork, ywork+(i+1)*gl_hchar-1,
X			calstring[i]);
X
X	if((year==curyr)&&(month==curmo)){
X		i = dow(curyr,curmo,1)+curday-1;
X#ifdef REVHIGHLIGHT
X		vsf_color(handle,1);
X		temp[0]=xwork+((i%7)*3+1)*gl_wchar-2;
X		temp[1]=ywork+((i/7)+2)*gl_hchar+1+hires;
X		temp[2]=temp[0]+2*gl_wchar+3-hires;
X		temp[3]=temp[1]+gl_hchar-1-hires;
X		v_bar(handle,temp);
X		vst_color(handle, 0);
X		vswr_mode(handle, 2);
X#else /* not REVHIGHLIGHT */
X		vst_color(handle, 3);
X#endif /* REVHIGHLIGHT */
X		v_gtext(handle,xwork+((i%7)*3+1)*gl_wchar,
X			ywork+((i/7)+3)*gl_hchar-1,
X			dtoa(curday,2));
X#ifdef REVHIGHLIGHT
X		vswr_mode(handle, 1);
X#endif /* REVHIGHLIGHT */
X		washighlighted = 1;
X	} else	washighlighted = 0;
X}
X
X/*page*/
X/*
X * dow -- find the day of the week
X *	for a given yr,mon,day between Mar1900 and Dec2099
X */
Xint dow(yr, mon, day) int yr, mon, day; {
X	register int d,i;
X
X	/* find day of week of jan1 of the year of interest */
X	d = (yr+((yr+3)/4)+5) % 7;
X
X	/* find day of week for first of month */
X	for(i=1; i<mon; ++i) d += daypermon[i-1];
X
X	/* and for the given day */
X	d += day-1;
X
X	return d % 7;
X}
X
Xmakecalpage(yr, mon, day) int yr, mon, day; {
X	register int i,monlen,xpos;
X
X	daypermon[1] = (yr%4) ? 28 : 29;
X
X	--mon;	/* create index into months array */
X
X	for(i=0; i<CALLINES; ++i)
X		strcpy(calstring[i], BLANKSTRING);
X
X	monlen = strlen(months[mon]);
X
X	xpos = (STRINGWIDTH/2) - (monlen+5)/2;
X
X	strncpy(&calstring[0][xpos],months[mon],monlen);
X	strncpy(&calstring[0][xpos+monlen+1],dtoa(year,4),4);
X
X	strncpy(calstring[1], DAYOFWEEKSTRING, LENDOWS);
X
X	xpos = dow(yr, mon+1, 1);
X	for(i=1; i<=daypermon[mon]; ++i,++xpos)
X		strncpy(&calstring[xpos/7+2][3*(xpos%7)+1],
X			dtoa(i,2),2);
X}
X
X/*page*/
X#ifdef DEBUG
Xputsaux( s ) char *s; {
Xchar c;
X
X	while(c = *s++) putcaux(c);
X}
X
Xputdaux( i ) int i; {
X	int pot, leading, d;
X
X	if (i < 0) {
X		putcaux('-');
X		i = -i;
X	}
X
X	leading = 0;
X	for(pot = 10000; pot >= 1; pot /= 10) {
X		d = i/pot; i -= d*pot;
X		if (d || leading || (pot == 1)) {
X			putcaux(d+0x30);
X			leading = 1;
X		} else putcaux(' ');
X	}
X}
X
Xputcaux( c ) char c; {
X	Bconout(DDEVICE, c);
X}
X#endif
xEOF
echo x string.c
sed 's/^X//' > string.c << 'xEOF'
Xstrcpy(s1,s2) register char *s1,*s2; {
X
X	while (*s1++ = *s2++);
X
X}
X
Xstrncpy(s1, s2, n) register char *s1,*s2; register int n; {
X	register char c;
X
X	while((c = *s2++) && n--) *s1++ = c;
X
X	while(n--) *s1++ = '\0';	/* NULL fill */
X}
X
Xint strlen(s1) register char *s1; {
X	register int length;
X
X	length = 0;
X
X	while(*s1++) ++length;
X
X	return length;
X}
xEOF
----
Jim Tittsler, Atari Corp  lll-crg!vecpyr!atari!jwt

jwt@atari.UUcp (Jim Tittsler) (04/24/86)

Here is the uuencoded binary for a calendar desk accessory for the ST.
It provides a "perpetual" (well, really 1980-2009) calendar page display,
showing the current month when initially opened.  It uses the vertical
scroll bar:  arrows move by month, shaded area by year.  It also attempts
to use the ikbd clock to maintain the TOS time of day across resets.
Enjoy.  Comments solicited.

----
begin 644 cal.acc
M8!H``!AL```"N@``"EP``````````````````"Y\```?*DZY```#VBZ\````
M`$Y!(B\`!#`\`,A.0DYU3E;_^DCG#PP^+@`(/"X`"BI\```A;$I';`P:_``M
M4T8P!T1`/@!)[O_Z0D4P!TC`@?P`"DA`T'P`,!C`4D5(QX_\``IG!+I&;>)*
M1V<00D5@!AK\`"I21;I&;?9@'D)'8`8:_``@4D<P!I!%OD!M\F`"&N0P!5-%
M2D!F]D(5(#P``"%L2I],WS#@3EY.=4Y6__Q*>0``(9)F%D*7/SP!`$ZY```5
MDE2/,_P``0``(9).7DYU3E;__$IY```ADF<40I<_/`$!3KD``!625(]">0``
M(9).7DYU3E;_^D)N__Y@%#!N__[1R-'\```D<C"\``%2;O_^#&X`"O_^;>0S
M_``"```DAC/Y```AC```(8XNO```),@O/```(8XO/```)').N0``$')0CTY>
M3G5.5O_T/6X`"/_X/6X`"O_Z,"X`"-!N``Q30#U`__PP+@`*T&X`#E-`/4#_
M_BZ.49<_/``!/SD``"&.3KD``!#R6(].7DYU3E;_]"Z.49<O#EV7+PY9ER\.
M59<P.0``),;G0#\`4E<P.0``)7C!_``6/P`_.0``&>@_.0``&>8_/`'+0F=.
MN0``%RS?_````!@^KO_X/R[_^C\N__P_+O_^/SP!RTZY```5UE"/,\```"5Z
M0E="9R\\```:XC\\``(_.0``)7I.N0``%M#?_`````I"5T)G0F<_//__/SP`
M$#\Y```E>DZY```6T-_\````"D)70F="9R\\```!:"\\```#Z#`Y```CE-!\
M^$3!_``,T'D``"%H2,`O`$ZY```1_E"/+P!.N0``$E)0CS\`/SP`"3\Y```E
M>DZY```6T-_\````"CZN__@_+O_Z/R[__#\N__X_.0``($P_.0``)$Y"9T)G
M3KD``!2LW_P````./J[_^#\N__H_+O_\/R[__C\Y```E>DZY```6$%"/+KP`
M`"&0+SP``"1P+SP``"2*+SP``"2(/SP`!#\Y```E>DZY```6?M_\````$$Y>
M3G5.5O_L80#]F#Z\``%.N0``%Q(];@`*__`];@`,__(];@`.__0];@`0__8N
MCE67+PY9ER\.79<O#E&7/SP`"S\Y```E>DZY```6?M_\````$&!<+HY1ER\.
M!I?____P3KD``!>>6(]*0&<>/J[__C\N__P_+O_Z/R[_^&$`_<)<CSZN``AA
M``<"+HY5ER\.69<O#EV7+PY1ES\\``P_.0``)7I.N0``%G[?_````!!*;O_\
M9P9*;O_^9IA"5TZY```7$F$`_0!.7DYU3E;_^$ZY```36BZ\```@3"\\```D
M3B\\```DQB\\```E>$ZY```54-_\````##/````AC%)Y```DQBZ\```:[3\Y
M```E5DZY```5M%2/,\```!]*/KP`%TZY```/+"U`__S`O`'@``!G+B`N__QR
M$.*@/H`_/``K3KD```],5(\@+O_\P+P``/__/H`_/``M3KD```],5(\S_/__
M```E>D)Y```ADCZ\``1.N0``#RRPO`````)G!$)`8`)P`3/````E?&$$3EY.
M=4Y6__I@``7F+KP``"54+SP``"!.+SP``"54+SP``"54+SP``"%X+SP``"%V
M0F<_/"<0+SP``"%Z0F="9T)G0F="9T)G0F="9T)G0F="9S\\``$_/``!/SP`
M,4ZY```3SM_\````.#U`__X^O``J3KD```],,'D``!GJL(AG``"8#'G__P``
M)7IG``",/KP`*DZY```/3#/````9ZC`Y```9ZL!\`!\SP```)3HP.0``&>KJ
M0,!\``\SP```(6HP.0``&>IR">)@T'P'O#/````D;C`Y```CE+!Y```D;F8.
M,#D``"%HL'D``"%J9PA*>0``(8IG(#ZY```AD#\Y```D<#\Y```DBC\Y```D
MB$)G80#]6E"//KP``4ZY```7$BZ\```E5"\\```E5"\\```E5"\\```DCC\\
M``H_.0``)7I.N0``%G[?_````!`(+@`$__]G``2.,#D``"%Z8``$;#`Y```A
M@+!Y```E>F8B/KD``"&(/SD``"&&/SD``"&$/SD``"&"/SP``6$`_-Y0CV``
M!%`P.0``(8"P>0``)7IF'D)70F="9T)G/SP`"C\Y```E>DZY```6T-_\````
M"F``!"`P.0``(8"P>0``'TIF'@QY__\``"5Z9Q0^N0``(8Y.N0``#]PS_/__
M```E>F```_`P.0``(8"P>0``)7IF8#ZY```E>DZY```62CZY```AD#\Y```D
M<#\Y```DBC\Y```DB#\Y```@3#\Y```D3D)G0F=.N0``%/[?_`````X^N0``
M)7I.N0``%F0^N0``(8Y.N0``#]PS_/__```E>F```WXP.0``(8"P>0``)7IF
M<#ZY```AB#\Y```AAC\Y```AA#\Y```A@C\\``4_.0``)7I.N0``%M#?_```
M``HNO```(9`O/```)'`O/```)(HO/```)(@_/``$/SD``"5Z3KD``!9^W_P`
M```0,_D``"2(```9YC/Y```DB@``&>A@``+\,#D``"&"L'D``!]*9@``N@QY
M__\``"5Z9@``D#Z\`"I.N0``#TPP>0``&>JPB&=P/KP`*DZY```/3#/````9
MZC`Y```9ZL!\`!\SP```)(PSP```)3HP.0``&>KJ0,!\``\SP```(6@SP```
M(6HP.0``&>IR">)@T'P'O#/````CE#/````D;CZY```DC#\Y```A:#\Y```C
ME&$`!298CV$`^,AA`/E@8!Y"5T)G0F="9S\\``H_.0``)7I.N0``%M#?_```
M``I@``(P,#D``"&"8```M%-Y```A:&8``,(S_``,```A:%-Y```CE#`Y```C
ME+!\![QL$#/\![P``".4,_P``0``(6A@``"44WD``".4,#D``".4L'P'O&P(
M,_P'O```(Y1@``!V4GD``"%H,#D``"%HL'P`#6UB,_P``0``(6A2>0``(Y0P
M.0``(Y2P?`?9;Q`S_`?9```CE#/\``P``"%H8#92>0``(Y0P.0``(Y2P?`?9
M;P@S_`?9```CE&`:8!A*0&>"L'P``6?8L'P``F<`_SZP?``#9XP^O/__/SD`
M`"%H/SD``".480`$$%B//KD``"&0/SD``"1P/SD``"2*/SD``"2(0F=A`/FP
M4(]"5T)G0F<O/````6@O/````^@P.0``(Y30?/A$P?P`#-!Y```A:$C`+P!.
MN0``$?Y0CR\`3KD``!)24(\_`#\\``D_.0``)7I.N0``%M#?_`````I@``#.
M0E="9T)G/SD``"&"/SP`"3\Y```E>DZY```6T-_\````"B\\```#Z"\\```!
M9S!Y```A@B\(3KD``!'^4(\O`$ZY```24E"/,\```"%H,#D``"%H2,"!_``,
MT'P'O#/````CE#`Y```A:$C`@?P`#$A`4D`SP```(6@^O/__/SD``"%H/SD`
M`".480`#"%B//KD``"&0/SD``"1P/SD``"2*/SD``"2(0F=A`/BH4(]@&F`8
MD'P`%+!\`!5B#N5`,$#1_```&C0@4$[00E=.N0``%Q)@`/H:3EY.=4Y6__)*
M;@`(9@A*>0``(8IG:#Z\``$_.0``(8Y.N0``$714CT)7/SD``"&.3KD``!$Z
M5(\]>0``)(C_^#UY```DBO_Z,#D``"2(T'D``"1P4T`]0/_\,#D``"2*T'D`
M`"&04T`]0/_^+HY1ES\Y```ACDZY```/EE2//KP``3\Y```ACDZY```1KE2/
M0F[_]F!`,"[_]L'\`!?0O```(Y8N@#`N__920,'Y```DQC\`,#D``"2*T5=3
M5S\Y```DB#\Y```ACDZY```0!ER/4F[_]@QN``C_]FVX,#D``".4L'D``"1N
M9@`!;#`Y```A:+!Y```A:F8``5P^O``!/SD``"%J/SD``"1N80`!4EB/T'D`
M`"4Z4T`]0/_V/KP``3\Y```ACDZY```1.E2/,"[_]DC`@?P`!TA`P?P``U)`
MP?D``"5XT'D``"2(54`]0/_X,"[_]DC`@?P`!U1`P?D``"3&T'D``"2*T'D`
M`"5\4D`]0/_Z,#D``"5XXT#0;O_X5D"0>0``)7P]0/_\,"[_^M!Y```DQE-`
MD'D``"5\/4#__BZ.49<_.0``(8Y.N0``#Y94CT)7/SD``"&.3KD``!&N5(\^
MO``"/SD``"&.3KD```]<5(\^O``"/SD``"4Z80#SI%2/+H`P+O_V2,"!_``'
M5D#!^0``),8_`#`Y```DBM%74U<P+O_V2,"!_``'2$#!_``#4D#!^0``)7@_
M`#`Y```DB-%7/SD``"&.3KD``!`&7(\^O``!/SD``"&.3KD```]<5(\S_``!
M```ABF`&0GD``"&*3EY.=4Y6``!(YP<`/BX`"%9'2,>/_``$WFX`"%I'2,>/
M_``'2$=\`6`2,$932-'(T?P``!H<,!#>0%)&O&X`"FWH,"X`#%-`WD`P!TC`
M@?P`!TA`2I],WP#`3EY.=4Y6``!(YP\`,"X`"$C`@?P`!$A`2D!G!'`<8`)P
M'3/````:'E-N``I"1V`>+KP``!KX,`?!_``7T+P``".6+P!.N0``#K)8CU)'
MOGP`"&W<,&X`"M'(T<@B?```&>PNL)@`3KD```\*/`!Z"S`&6D!(P('\``*:
M0#Z&,&X`"M'(T<@B?```&>PO,)@`,`5(P-"\```CEB\`3KD```[04(\^O``$
M/SP`!#\Y```CE&$`\B!8CR\`,`701DC`T+P``".6+P!2ETZY```.T%"//KP`
M%B\\```;#R\\```CK4ZY```.T%"//KP``3\N``I25S\N``AA`/ZP6(\Z`'X!
M8$@^O``"/SP``C\'80#QQ%B/+P`P!4C`@?P`!U1`P?P`%S(%2,&#_``'2$'#
M_``#2,'0@="\```CEB\`4I=.N0``#M!0CU)'4D4P;@`*T<C1_```&AR^4&^H
M2I],WP#@3EY.=4Y6``!(YP$,*FX`""AN``P:W&;\2I],WS``3EY.=4Y6``!(
MYP<,*FX`""AN``P^+@`08`(:QAP<9P@P!U-'2D!F\F`"0ATP!U-'2D!F]DJ?
M3-\PP$Y>3G5.5@``2.<#!"IN``A"1V`"4D=*'6;Z,`=*GTS?((!.7DYU(]\`
M`!\N3DXO.0``'RY.=2/?```?+DY-+SD``!\N3G4CWP``'RY.02\Y```?+DYU
M3E;__#/N``H``!],,_P`(```)5A">0``)5HS_``!```E7C/N``@``"5D3KD`
M`!'H,#D``"!03EY.=4Y6__PC[@`*```?.C/\``L``"58,_P``@``)5I">0``
M)5XS_``!```E8C/N``@``"5D3KD``!'H(_P``"&4```?.DY>3G5.5O_\,_P`
M90``)5A">0``)5I">0``)5XS[@`(```E9$ZY```1Z$Y>3G5.5O_Z,^X`"@``
M(90S[@`,```AED)N__X@;@`.$!!(@,!\`/\R;O_^T\G3_```'TPR@%*N``Y2
M;O_^2D!FVC/\``@``"58,_P``0``)5I3;O_^,^[__@``)5XS[@`(```E9$ZY
M```1Z$Y>3G5.5O_\(^X`"```'S8C[@`0```?/B`N`!#0O````%HCP```'T(S
M_`!D```E6$)Y```E6C/\``L``"5>(&X`##/0```E9$ZY```1Z"!N``PPN0``
M)60C_```'TP``!\V(_P``"!0```?/B/\```BE```'T(C_```(90``!\Z3EY.
M=4Y6__PC[@`,```?.C/N``H``!],,_P`@0``)5@S_``"```E6C/\``$``"5>
M,^X`"```)61.N0``$>@C_```(90``!\Z3EY.=4Y6__PS[@`*```?3#/\`!D`
M`"580GD``"5:,_P``0``)5XS[@`(```E9$ZY```1Z#`Y```@4$Y>3G5.5O_\
M,^X`"@``'TPS_``7```E6$)Y```E6C/\``$``"5>,^X`"```)61.N0``$>@P
M.0``(%!.7DYU3E;__#/N``H``!],,_P`%@``)5A">0``)5HS_``!```E7C/N
M``@``"5D3KD``!'H,#D``"!03EY.=2/\```E6```'S(B/```'S)P<TY"3G5.
M5O_\0D)*K@`(;`9$K@`(4D)*K@`,;`9$K@`,4D(P+@`*P.X`#BU`__PP+@`(
MP.X`#C(N``S"[@`*T$'0;O_\/4#__"`N__P(`@``9P)$@$Y>3G5.5O_^2.<_
M`$)#0H4N+@`(+"X`#&88(_R````````?1B`\@````('\``!@``!H;`1$AE)#
M2H=L!$2'4D.\AVXX9@9Z`4*'8#"^O``!``!L"H[&.@=(1TC'8!YX`;Z&90;C
MAN.$8/9*A&<.OH9E!(J$GH;BC.*.8.ZV?``!9@Y$AR/'```?1B`%1(!@""/'
M```?1B`%2I],WP#X3EY.=4Y6__8S[@`(```DD#`N``C0?/_VP?P``TC`T+P`
M`!AL+4#_^CU\``'__F`>(&[_^A`02(`R;O_^T\G3_```))`R@%*N__I2;O_^
M#&X`!/_^;=HNN0``)5!.N0```!1"0#`Y```DN$Y>3G5.5O_Z(_P``"20```A
M4"/\```D4```(50C_```))@``"%8(_P``"2X```A7"/\```E<```(6`C_```
M)7X``"%D(_P``"%0```E4#Z\``IA`/]&,_D``"2X```E5G`!3EY.=4Y6__P^
MO``380#_*G`!3EY.=4Y6__PS[@`(```DF#/N``H``"2:,^X`#```))PS[@`.
M```DGC/N`!```"2@,^X`$@``)*(S[@`4```DI#/N`!8``"2F,^X`&```)*@S
M[@`:```DJC/N`!P``"2L,^X`'@``)*XS[@`@```DL#/N`"(``"2R(^X`)```
M)7`S[@`H```DM#/N`"H``"2V/KP`&4ZY```2\"!N`"PPN0``)+H@;@`P,+D`
M`"2\(&X`-#"Y```DOB!N`#@PN0``),`@;@`\,+D``"3"(&X`0#"Y```DQ$)`
M,#D``"2X3EY.=4Y6__PS[@`(```DF#/N``H``"2:,^X`#```))PS[@`.```D
MGC/N`!```"2@,^X`$@``)*(S[@`4```DI#/N`!8``"2F/KP`24ZY```2\$Y>
M3G5.5O_\,^X`"```))@S[@`*```DFC/N``P``"2<,^X`#@``))XS[@`0```D
MH#/N`!(``"2B,^X`%```)*0S[@`6```DICZ\`$I.N0``$O!.7DYU3E;__#Z\
M`$U.N0``$O`@;@`(,+D``"2Z(&X`##"Y```DO"!N`!`PN0``)+X@;@`4,+D`
M`"3`0D`P.0``)+A.7DYU3E;__#/N``@``"28(^X`"@``)7`^O`!.3KD``!+P
M3EY.=4Y6__PS[@`(```DF"/N``H``"5P/KP`(TZY```2\$Y>3G5.5O_\,^X`
M"```))@S[@`*```DFC/N``P``"2<,^X`#@``))XS[@`0```DH#Z\`&1.N0``
M$O!.7DYU3E;__#/N``@``"28,^X`"@``))HS[@`,```DG#/N``X``"2>,^X`
M$```)*`^O`!E3KD``!+P3EY.=4Y6__PS[@`(```DF#Z\`&9.N0``$O!.7DYU
M3E;__#/N``@``"28/KP`9TZY```2\$Y>3G5.5O_\,^X`"```))@S[@`*```D
MFCZ\`&A.N0``$O`@;@`,,+D``"2Z(&X`$#"Y```DO"!N`!0PN0``)+X@;@`8
M,+D``"3`0D`P.0``)+A.7DYU3E;__#/N``@``"28,^X`"@``))HS[@`,```D
MG#/N``X``"2>,^X`$```)*`S[@`2```DHCZ\`&E.N0``$O!.7DYU3E;__#/N
M``@``"28/KP`:TZY```2\$Y>3G5.5O_\,^X`"```))@S[@`*```DFC/N``P`
M`"2<,^X`#@``))XS[@`0```DH#/N`!(``"2B/KP`;$ZY```2\"!N`!0PN0``
M)+H@;@`8,+D``"2\(&X`'#"Y```DOB!N`"`PN0``),!"0#`Y```DN$Y>3G5.
M5@``2.<?#"IN``@H;@`,/I4P+0`$T5<_%#`L``315TZY```84%2/.@`^K0`"
M,"T`!M%7/RP``C`L``;15TZY```84%2/.``^E3\43KD``!@T5(\^`#ZM``(_
M+``"3KD``!@T5(\\`#B'.48``C`%D$<Y0``$,`201CE```:Z1V\$N$9N!$)`
M8`)P`4J?3-\P\$Y>3G5.5O_\,"X`"+!N``IO!C`N``A@!#`N``I.7DYU3E;_
M_#`N``BP;@`*;`8P+@`(8`0P+@`*3EY.=0`!``(!`0(!`0`!`0(!`0$!`0``
M```````````!```!``,%``4%```!`0(!`!`'`0(!``````````````$!`0(!
M`0(!`0(!`0$!`@$!`0````````````````(!`0$!`08!`00!`0$#`0(!`00"
M`0@!`0````````$!`0D!`0$!`0$!```%`0``````````````````````````
M``````````````````````````````````0#``@#``8!``@!``@!``0!`0,!
M`0`%``$!`0`%```!`0`!`0`````````````````````````````````"`@``
M``````````````````````````````````4!``4!``$!``$!``(%``8!``(!
M``$!``8%```````!`0`!``(!``(!`0$!`0`````````````````````!`@,!
M`@$!`0$!`0`!`0`!`D`H(RE#04PN04-#(%8Q+C`P("!J=W1`871A<FD```!D
M`#+__P``&HP``!J4```:G0``&J,``!JI```:K0``&K(``!JW```:O@``&L@`
M`!K0```:V0`?`!P`'P`>`!\`'@`?`!\`'@`?`!X`'P``!@8```8Z```&F@``
M"H@```A:```*B```";P```J(```'#```!CH```J(```*B```"H@```J(```*
MB```"H@```J(```*B```"H@```J(```'C@``!FI*86YU87)Y`$9E8G)U87)Y
M`$UA<F-H`$%P<FEL`$UA>0!*=6YE`$IU;'D`075G=7-T`%-E<'1E;6)E<@!/
M8W1O8F5R`$YO=F5M8F5R`$1E8V5M8F5R`"!#04Q%3D1!4B``("!#86QE;F1A
M<@`@("`@("`@("`@("`@("`@("`@("`@`"!3;B`@32!4=2`@5R!4:"`@1B!3
M82```````@8J;A0."@X."!H8!@0&!@8&0`8@#`P&#"`("@H&&@8>#@H*#@8<
M!@H<!@@&!@8*!APR!AH^!AH2!@8&!@8,!@8&!@@*(!@*!@H4%`8&!@8&#"@4
M!@X.!@8*!@P&#@8&"`8("`8&!A(&!@8&"@86"@8(!@8&%`84!A`&"@@&"`H&
M"`8&!@8&!@8*#`8&!@@*!@@&!@8*!@P&!@8*!@P$!@0*!@P.!@X&!@H&!@P&
M!@X&!@8&(@80"@P&!@X("@8."@8.!@8."`@&#B8&#`8&!B`."@H.!A8*!A@(
M"@@&$`80"@8,!@8&(`P8#`8*!@@("`8,!A`&#`86#@@*!@84!@H&#@8,$`8:
M!A@&!@P.#@@.!@H&#`8,&@@<"`@&#`8*"#9,#@P(&`H@#@@0%`H,!@94"A*.
M"`@("`@."`8("`8&$`@(!@@(!@8$$`8&"`80"!P6"`P(!A`($`@&"`H&"@8$
M!@0&!`8$$`@("`@(!@8$$`@&"`@&!A`(!@@(!@80"`8("`8&"@0&>F8,&!0@
M&`8(#@0&!`8$!@0&!`8$!@0.!"0("`@("`@("`@("`@("`@("@H*"@H*"@@0
M"`@("`@("`H0"`@("`@("`H2"@H*"@@0"`H0"`H0"`@("`H0"`@("`H0"A`*
M$`@*"@H*"@@0"`@("`@*$`H0"`@("`@*"@H*"@@J'@X2`?`$!`0$!`0$!`0$
8!!P$!`0$!`0$!`0$!`0$!`0$!`0$!`0`
`
end

----
Jim Tittsler, Atari Corp.   lll-crg!vecpyr!atari!jwt