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