koreth@ssyx.ucsc.edu (Steven Grimm) (06/10/88)
Submitted-by: cst.prl.philips.nl!meulenbr (Frans Meulenbroeks)
Posting-number: Volume 1, Issue 52
Archive-name: assist2/part01
[This accessory contains a clock-setter and some disk utilities. Uuencoded
resource files are included. I got it to compile under Laser C. -sg]
#!/bin/sh
# shar: Shell Archiver (v1.22)
#
# This is part 1 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
#
# Run the following text with /bin/sh to create:
# ASSIST2.C
# ASSIST2.H
# ASSIST2.MAK
# ASSIST2.RSC
# ASSIST2.RSD
# INCLUDE.H
#
if test -r s2_seq_.tmp
then echo "Must unpack archives in sequence!"
next=`cat s2_seq_.tmp`; echo "Please unpack part $next next"
exit 1; fi
sed 's/^X//' << 'SHAR_EOF' > ASSIST2.C &&
X#include "assist2.h"
X#include "include.h"
X#include "gemdefs.h"
X#include "gembind.h"
X
X#define FILENAME "ASSIST2.RSC"
X#define ACCNAME " The Assistant "
X
X
X/****************************************************************/
X/*** If you have a battery backup of your systemclock ***/
X/*** please tell the compiler witch timer keeps on running ***/
X/*** >>> System clock (GEM) ***/
X/*** >>> Keyboard processor clock (KEY) ***/
X/****************************************************************/
X
X#define GEM 0
X
X/****************************************************************/
X/*** In Europa there is another date-format then ***/
X/*** there is in the USA ***/
X/*** define the date-format here ***/
X/*** >>> 31-12-87 (EUR) ***/
X/*** >>> 12-31-87 (USA) ***/
X/****************************************************************/
X
X#define EUR 0
X
X/****************************************************************/
X/*** Decaration of the variables ***/
X/****************************************************************/
X
XOBJECT *tree;
Xint contrl[12],intin[128],intout[128],ptsin[128],ptsout[128];
Xint in[11],out[57];
Xextern int gl_apid;
Xshort btime=TRUE,bdate=FALSE,balarm=FALSE;
Xchar td_string[18] = "00.00.00 00:00:00";
Xchar *time_string="000000",*date_string="000000";
Xchar wait[] = { 0xff, 20 ,0xff, 0 };
Xint first,vn,zh,button,wh;
Xint bx,by,bw,bh,xdesk,ydesk,wdesk,hdesk;
X
X
Xint info_track;
Xint info_sector;
Xint info_side;
Xlong info_free;
Xchar info_name[14];
X
X
X
Xmain()
X{
Xregister long time; /*** use register for speed ***/
Xregister char temp;
Xint event,h;
X
Xint eind;
Xchar bfree[7];
XOBJECT *tree;
Xappl_init();
Xfirst=TRUE;
X /********************************************/
X /*** Copy the time and date ***/
X /*** From GEM (system) to BIOS (keyboard) ***/
X /*** or ***/
X /*** From BIOS (keyboard) to GEM (system) ***/
X /********************************************/
X/*
X#ifdef GEM
Xtel_bios(Tgetdate(),Tgettime());
X#else
Xtel_gem(Gettime());
X#endif
X
X*/
Xif(!rsrc_load(FILENAME)) /*** try to load the RSC-file ***/
X {
X form_alert(1,"[3][I'm sorry, but I can't find|the RESOURCE-file.][ #&%$*##&^ ]");
X appl_exit();
X }
Xelse
X {
X vn = graf_handle(&h,&zh,&h,&h); zh -= 2;
X v_opnvwk(&h,&vn,out);
X vst_color(vn,1);
X wind_get(0,WF_WXYWH,&xdesk,&ydesk,&wdesk,&hdesk);
X /*** Put program-name into the desktop ***/
X
X menu_register(gl_apid,ACCNAME);
X rsrc_gaddr(0,CLOCK,&tree);
X set_text(tree,TIME,time_string);
X set_text(tree,DATE,date_string);
X while(TRUE) /*** means always ***/
X {
X time = Gettime(); /*** get the time and date ***/
X /*** from the keyboard ***/
X
X /*get the second's*/
X temp = ((((char)time) & 0x1f)*2);
X convert_time(temp,15,4);
X
X /*get the minutes*/
X time >>= 5;
X temp = ((char)time) & 0x3f;
X convert_time(temp,12,2);
X
X /*get the hours*/
X time >>=6;
X temp = time & 0x1f;
X convert_time(temp,9,0);
X
X /*get the day*/
X time >>=5;
X temp = ((char)time) & 0x1f;
X #ifdef EUR
X convert_date(temp,0,0); /*Europe format*/
X #else
X convert_date(temp,3,2); /*USA format*/
X #endif
X
X /*get the month*/
X time >>=5;
X temp = ((char)time) & 0x0f;
X #ifdef EUR
X convert_date(temp,3,2);
X #else
X convert_date(temp,0,0);
X #endif
X
X /*get the year*/
X temp = ((char)((time >> 4) + 80L) % 100) & 0x7f;
X convert_date(temp,6,4);
X
X rsrc_gaddr(0,CLOCK,&tree);
X
X /********************************************/
X /*** if alarm is set then ***/
X /*** check if the timestring is the same ***/
X /*** as the alarmstring. ***/
X /********************************************/
X
X if (balarm==TRUE && (strncmp(( (TEDINFO *) (tree + ALARM)->ob_spec )->te_ptext,time_string,4))==0)
X {
X balarm=FALSE; /*** set alarm off ***/
X setp(tree,ALARMON,NORMAL);
X setp(tree,ALARMOFF,SELECTED);
X ping(); /*** give some sound ***/
X do_dialog(ALERT1,0); /*** tel the user it's time ***/
X }
X if (btime == TRUE && bdate == TRUE)
X {
X /*** display the ***/
X /*** whole timestring ***/
X
X v_gtext(vn,502,zh,td_string);
X }
X else
X {
X if (btime == TRUE && bdate == FALSE)
X {
X /*** display only ***/
X /*** the date ***/
X
X v_gtext(vn,574,zh,&td_string[9]);
X }
X else
X {
X if (btime == FALSE && bdate == TRUE)
X {
X /*** make an early end to ***/
X /*** the string and display ***/
X /*** the time ***/
X
X td_string[9]=0;
X v_gtext(vn,574,zh,td_string);
X }
X }
X }
X if (((date_string[5]-'0')<7)&&( first==TRUE))
X {
X ping();
X first=FALSE;
X wnd_opn();
X clock();
X wnd_cls();
X }
X
X /********************************************/
X /*** check wat's happening. ***/
X /********************************************/
X
X event = evnt_multi(MU_TIMER | MU_MESAG,0,0,0,0,0,0,0,0,0,0,0,
X 0,0,out,2000,0,&h,&h,&h,&h,&h,&h);
X if((event & MU_MESAG) && (*out == AC_OPEN))
X {
X wnd_opn();
X rsrc_gaddr(0,MAIN,&tree);
X eind = FALSE;
X while(eind != TRUE)
X {
X ltoa(Malloc(-1L),bfree);
X set_text(tree,MBFREE,bfree);
X form_center(tree,&bx,&by,&bw,&bh);
X form_dial(0,0,0,0,0,bx,by,bw,bh);
X form_dial(1,0,0,0,0,bx,by,bw,bh);
X objc_draw(tree,0,32,bx,by,bw,bh);
X button=form_do(tree,0);
X objc_change(tree,button,0,bx,by,bw,bh,NORMAL,0);
X form_dial(3,0,0,0,0,bx,by,bw,bh); /*** erase dialog ***/
X switch(button)
X {
X
X case ABOUT:
X do_dialog(INTRO,0);
X break;
X
X case MCLOCK:
X clock();
X break;
X
X case MFORMAT:
X format();
X break;
X
X case MAKEDIR:
X makedir();
X break;
X
X case MINFOA:
X case MINFOB:
X disk_info(button-MINFOA);
X break;
X
X case MERASEA:
X case MERASEB:
X disk_erase(button-MERASEA);
X break;
X
X case MCANCEL:
X eind=TRUE;
X break;
X } /* end of switch */
X } /* end of while */
X wnd_cls();
X }
X }
X appl_exit();
X }
X}
X
X
X
Xdisk_erase(drive)
Xint drive;
X{
Xif (insert(drive)==OKINSERT)
X {
X if (get_info(drive)==TRUE)
X {
X make_boot(info_track,info_sector,info_side-1,drive,"ASSIST2 FMT");
X disk_info(drive);
X }
X }
X}
X
X
X
Xdisk_info(drive)
Xint drive;
X{
XOBJECT *tree;
Xint again=TRUE;
Xchar *track="00",*sector="00",*side="0",*free="000000";
X
Xrsrc_gaddr(0,DISKINFO,&tree);
Xwhile (again == TRUE)
X {
X Fsfirst("$%&&&&.&^&",255);
X again=FALSE;
X info_name[0]=0;
X if (get_info(drive)==TRUE)
X {
X ltoa((long)info_track,track);
X ltoa((long)info_sector,sector);
X ltoa((long)info_side,side);
X ltoa((long)info_free,free);
X set_text(tree,INFOTRAC,track);
X set_text(tree,INFOSECT,sector);
X set_text(tree,INFOSIDE,side);
X set_text(tree,INFOFREE,free);
X set_text(tree,INFONAME,info_name);
X do_dialog(DISKINFO,0);
X if (button == INFOAGAI) again=TRUE;
X }
X }
X}
X
X
X
Xget_info(drive)
Xint drive;
X{
Xint dummy,error,old_drive;
Xchar *buffer;
Xlong buf[4];
XDTABUF *dtabuf;
Xbuffer = malloc(20000);
Xdtabuf = (DTABUF *) Fgetdta();
Xold_drive=Dgetdrv();
XDsetdrv(drive);
Xdummy=Floprd(buffer,0L,drive,1,0,0,1);
Xif(dummy < 0)
X {
X do_dialog(DISKERRO,0);
X error=FALSE;
X }
Xelse
X {
X if (Fsfirst("*.*",8)==0)
X {
X for(dummy=0; dummy<14; dummy++) info_name[dummy]=dtabuf->name[dummy];
X info_name[dummy++]=0;
X }
X Dfree(&buf,drive+1);
X info_free=buf[0]*buf[2]*buf[3];
X info_side=get_no(0x1a,buffer);
X info_track=get_no(0x13,buffer)/(get_no(0x18,buffer) * get_no(0x1a,buffer));
X info_sector=get_no(0x18,buffer);
X error=TRUE;
X }
Xfree(buffer);
XDsetdrv(old_drive);
Xreturn(error);
X}
X
X
X
X
X/****************************************************************/
X/*** convert the integer time ***/
X/*** to ASCII and put that into ***/
X/*** two strings. ***/
X/****************************************************************/
Xconvert_time(time,n1,n2)
Xregister char time;
Xint n1,n2;
X{
Xtd_string[n1] = time_string[n2] = time /10 +'0';
Xtd_string[n1+1] = time_string[n2+1] = time %10 +'0';
X}
X
X
X/****************************************************************/
X/*** convert the integer date ***/
X/*** to ASCII and put that into ***/
X/*** two strings. ***/
X/****************************************************************/
Xconvert_date(date,n1,n2)
Xregister char date;
Xint n1,n2;
X{
Xtd_string[n1] = date_string[n2] = date / 10 + '0';
Xtd_string[n1+1] = date_string[n2+1] = date % 10 + '0';
X}
X
X
X/****************************************************************/
X/*** function to let the user set the date, ***/
X/*** time and alarm and how to display it. ***/
X/****************************************************************/
Xclock()
X{
Xchar date2[6],time2[6];
Xint time=0,date=0;
X
X /*** copy the date and time ***/
X /*** currently in the dialogbox ***/
Xstrcpy(date2,date_string);
Xstrcpy(time2,time_string);
X /*** ask for user respond ***/
Xdo_dialog(CLOCK,TIME);
X /*** set some controle var.'s ***/
Xbtime=selectp(tree,TIMEON);
Xbdate=selectp(tree,DATEON);
Xbalarm=selectp(tree,ALARMON);
X /*** if exit is SETTIME ***/
X /*** set the time and date ***/
Xif (button == SETTIME)
X {
X time |= convert(time_string,0);
X time <<=6;
X time |= convert(time_string,2);
X time <<=5;
X time |= (convert(time_string,4)/2);
X Tsettime(time);
X date |= (convert(date_string,4)-80);
X date <<=4;
X#ifdef EUR
X date |= convert(date_string,2);
X date <<=5;
X date |= convert(date_string,0);
X#else
X date |= convert(date_string,0);
X date <<=5;
X date |= convert(date_string,2);
X#endif
X Tsetdate(date);
X tel_bios(Tgetdate(),Tgettime());
X }
Xv_gtext(vn,502,zh," "); /***clear the desktop***/
X}
X
X
X
X/****************************************************************/
X/*** function to convert a 2byte-string into an integer ***/
X/****************************************************************/
Xconvert(string,number)
Xchar *string;
Xint number;
X{
Xreturn((string[number]-'0')*10 +(string[number+1]-'0'));
X}
X
X
X
X
X/****************************************************************/
X/*** function to give some sound ***/
X/****************************************************************/
Xping()
X{
XCconout(7);
Xwhile(Dosound(-1L));
XDosound(wait);
Xwhile(Dosound(-1L));
XCconout(7);
X}
X
X
X/****************************************************************/
X/***function to get the time from GEM and send it to the bios ***/
X/****************************************************************/
Xtel_bios(timedate)
Xlong timedate;
X{
XSettime(timedate);
X}
X
X
X/****************************************************************/
X/*** reverse of the above ***/
X/****************************************************************/
Xtel_gem(date,time)
Xint date,time;
X{
XTsetdate(date);
XTsettime(time);
X}
X
X
X
X/****************************************************************/
X/*** function to set the state of an object ***/
X/*** to NORMAL,SELECTED,...... ***/
X/****************************************************************/
X
Xsetp(tree,object,bit)
XOBJECT *tree;
Xint object,bit;
X{
Xobjc_change(tree,object,0,bx,by,bw,bh,bit,0);
X}
X
X
X
Xdo_format(tr,se,si,dr,diskn)
Xint tr,se,si,dr;
Xchar *diskn;
X{
XOBJECT *tree;
Xint dt,button;
Xchar trs[2],sis[2],*buffer;
Xsis[0]= '0';
Xbuffer = malloc(20000);
Xrsrc_gaddr(0,GO,&tree);
X /*** set walking-bar to start ***/
Xinit_prog();
X /*** let some RSC-strings point ***/
X /*** to our own strings ***/
Xset_text(tree,GOTRACK,trs);
Xset_text(tree,GOSIDE,sis);
X /*** display a dialog box ***/
Xform_center(tree,&bx,&by,&bw,&bh); /*** get coordinates ***/
Xform_dial(0,0,0,0,0,bx,by,bw,bh ); /*** reserve screen ***/
Xform_dial(1,0,0,0,0,bx,by,bw,bh); /*** make growbox ***/
Xobjc_draw(tree,0,MAX_DEPTH,bx,by,bw,bh);
Xfor(dt=0;dt<tr;dt++)
X {
X /*** let the user see ***/
X /*** what's going on ***/
X set_prog((float)dt,(float)tr-1,bx,by,bw,bh);
X ltoa((long)dt,trs);
X objc_draw(tree,GOTRACK,0,bx,by,bw,bh);
X objc_draw(tree,GOSIDE,0,bx,by,bw,bh);
X /*** and format side one ***/
X button = Flopfmt(buffer,0L,dr,se,dt,0,01,0x87654321L,0xe5e5);
X /*** if asked for. ***/
X /*** format side two ***/
X if((si == 1) && (button == 0))
X {
X sis[0] +=1;
X objc_draw(tree,GOSIDE,0,bx,by,bw,bh);
X sis[0] -=1;
X button = Flopfmt(buffer,0L,dr,se,dt,1,01,0x87654321L,0xe5e5);
X }
X /*** if something goes wrong ***/
X /*** button is true ***/
X if(button != 0) dt = (tr+1);
X }
Xform_dial(3,0,0,0,0,bx,by,bw,bh); /*** erase dialog ***/
Xfree(buffer);
Xif (button == FALSE) make_boot(tr,se,si,dr,diskn);
Xelse do_dialog(DISKERRO,0);
X}
X
X
X
X
X
Xformat()
X{
X
XOBJECT *tree;
Xint sectors,tracks=80,sides,drive,eind;
Xchar *diskname="EXTENDEDFMT",*track="80";
X
Xrsrc_gaddr(0,EXFORMAT,&tree);
Xset_text(tree,DISKNAME,diskname);
Xset_text(tree,TRACKNUM,track);
Xform_center(tree,&bx,&by,&bw,&bh);
Xform_dial(0,0,0,0,0,bx,by,bw,bh);
Xform_dial(1,0,0,0,0,bx,by,bw,bh);
Xobjc_draw(tree,0,32,bx,by,bw,bh);
Xeind = FALSE;
Xwhile(eind != TRUE)
X {
X button=form_do(tree,DISKNAME);
X objc_change(tree,button,0,bx,by,bw,bh,NORMAL,0);
X switch(button){
X
X case FORMAT:
X sides= selectp(tree,DS);
X drive= selectp(tree,DRIVEB);
X sectors=selectp(tree,SEC10)+9;
X form_dial(3,0,0,0,0,bx,by,bw,bh); /*** erase dialog ***/
X if (insert(drive)==OKINSERT)
X {
X do_format(tracks,sectors,sides,drive,diskname);
X disk_info(drive);
X }
X eind=TRUE;
X break;
X
X case CANCEL:
X eind=TRUE;
X form_dial(3,0,0,0,0,bx,by,bw,bh); /*** erase dialog ***/
X break;
X
X
X case TRACKDWN:
X case TRACKUP:
X if ((button==TRACKUP)&(tracks<83)) tracks+=1;
X if ((button==TRACKDWN)&(tracks>80)) tracks-=1;
X ltoa((long)tracks,track);
X evnt_timer(100,0);
X objc_draw(tree,TRACKNUM,0,bx,by,bw,bh);
X break;
X
X }
X }
X}
X
X
X
X/****************************************************************/
X/*** function to set the width of the object used by the ***/
X/*** progress-indicator to zero ***/
X/****************************************************************/
Xinit_prog()
X{
XOBJECT *tree;
X
Xrsrc_gaddr(0, GO, &tree);
X(tree + BAR)->ob_width = 0;
X}
X
X
Xinsert(drive)
Xint drive;
X{
Xchar *str_drive="X";
XOBJECT *tree;
Xrsrc_gaddr(0,INSERT,&tree);
Xstr_drive[0]=drive+'A';
Xset_text(tree,AINSERT,str_drive);
Xdo_dialog(INSERT,0);
Xreturn(button);
X}
X
X
Xltoa(number,string)
Xlong number;
Xchar *string;
X{
Xsprintf(string,"%ld ",number);
X}
X
X
X
X/****************************************************************/
X/*** function to make an adjusted bootsector ***/
X/****************************************************************/
X
Xmake_boot(tr,se,si,dr,diskn)
Xint tr,se,si,dr;
Xchar *diskn;
X{
Xint total,dummy;
Xchar *buffer;
Xbuffer=malloc(20000);
X /*** Make a new bootsector and ***/
X /*** write is to disk ***/
X
Xtotal=(tr * se);
Xfor(dummy=0; dummy<(se*512); *(buffer + dummy++)=0);
XProtobt(buffer,0x01000000L,(((tr>40)*2)+si),0);
X*(buffer + 0x13)=(total+(si ? total : 0)) &0xff;
X*(buffer + 0x14)=((total+(si ? total : 0)) >> 8) &0xff;
X*(buffer + 0x18)=se;
XFlopwr(buffer,0L,dr,1,0,0,se);
X
Xfor(dummy=0; dummy<512; buffer[dummy++]=0);
Xfor (dummy=0; dummy<strlen(diskn); dummy++)
X {
X diskn[dummy]=toupper(diskn[dummy]);
X }
Xsprintf(buffer,diskn);
Xbuffer[11]=8;
XFlopwr(buffer,0L,dr,(12-se),(1-si),si,(se-4));
Xfree(buffer);
X}
X
X
X/****************************************************************/
X/*** function to check if an object is SELECTED ***/
X/****************************************************************/
Xselectp(tree,which)
Xlong tree;
Xint which;
X{
Xreturn statep(tree,which,SELECTED);
X}
X
X
X
X
X/****************************************************************/
X/*** function to set the width of an object ***/
X/*** changing the width of an object and redraw that object ***/
X/*** wil give us a process-indicator ***/
X/****************************************************************/
Xset_prog(value, maxc,x,y,w,h)
Xfloat value, maxc;
Xint x,y,w,h;
X{
XOBJECT *tree;
XGRECT box;
X
Xrsrc_gaddr(0, GO, &tree);
X(tree + BAR)->ob_width=((((tree + BOX)->ob_width ) / maxc) * value);
Xobjc_draw(tree,BAR,0,x,y,w,h);
X}
X
X
X
Xset_text(tree,object,string)
XOBJECT *tree;
Xint object;
Xchar *string;
X{
XTEDINFO *obspec;
X
Xobspec= (TEDINFO *) (tree +object)->ob_spec;
Xobspec->te_ptext=string;
Xobspec->te_txtlen=strlen(string)+1;
X}
X
X
X
X
X
X/****************************************************************/
X/*** function to get the state of an object ***/
X/*** to NORMAL,SELECTED,...... ***/
X/****************************************************************/
X
Xstatep(tree,which,bit)
Xlong tree;
Xint which,bit;
X{
Xreturn((LWGET(OB_STATE(which)) & bit) != FALSE);
X}
X
X
X/****************************************************************/
X/*** function to convert an integer in MSDOS-format ***/
X/*** to ATARI format ***/
X/****************************************************************/
Xget_no(i,buffer)
Xint i;
Xchar *buffer;
X{
Xint low,high;
Xlow = *(buffer + i); high = *(buffer+ i+1);
Xif(low < 0) high += 1;
Xreturn(low + (256*high));
X}
X
Xmakedir()
X{
XOBJECT *tree;
Xchar *path,*name="12345678.123\0";
Xint dummy;
Xpath = (char *)Malloc(40L);
Xstrcpy(name,"FILENAME.EXT\0");
Xstrcpy(path,"A:\\*.*\0");
Xpath[0]=(Dgetdrv()+'A');
XDsetpath(path);
Xfsel_input(path,name,&button);
Xif (button==1)
X {
X for(dummy=strlen(path); dummy>0;dummy--)
X {
X if (path[dummy]=='\\')
X {
X path[dummy]=0;
X dummy=0;
X }
X }
X Dsetdrv(path[0]-'A');
X Dsetpath(path);
X if(Dcreate(name)) do_dialog(DISKERRO,0);
X }
XMfree(path);
X}
X
X
X
X/****************************************************************/
X/** function to get user-respond from a already drawn dialog. **/
X/** And to set the exitbutton to NORMAL. **/
X/****************************************************************/
X
Xdo_dialog(dialog,edit)
Xint dialog,edit;
X{
Xrsrc_gaddr(0,dialog,&tree);
Xform_center(tree,&bx,&by,&bw,&bh); /*** get coordinates ***/
Xform_dial(0,0,0,0,0,bx,by,bw,bh ); /*** reserve screen ***/
Xform_dial(1,0,0,0,0,bx,by,bw,bh); /*** make growbox ***/
Xobjc_draw(tree,0,MAX_DEPTH,bx,by,bw,bh);
Xbutton = form_do(tree,edit);
Xform_dial(2,0,0,0,0,bx,by,bw,bh); /*** schrink box ***/
Xform_dial(3,0,0,0,0,bx,by,bw,bh); /*** erase dialog ***/
Xsetp(tree,button,NORMAL);
X}
X
Xwnd_opn()
X{
Xwh=wind_create(0,xdesk,ydesk,wdesk,hdesk);
Xwind_open(wh,xdesk,ydesk,wdesk,hdesk);
X}
X
Xwnd_cls()
X{
Xwind_close(wh);
Xwind_delete(wh);
X}
X
SHAR_EOF
chmod 0600 ASSIST2.C || echo "restore of ASSIST2.C fails"
sed 's/^X//' << 'SHAR_EOF' > ASSIST2.H &&
X/* resource set indicies for ASSIST2 */
X
X#define EXFORMAT 0 /* form/dialog */
X#define TRACKUP 6 /* BUTTON in tree EXFORMAT */
X#define TRACKDWN 7 /* BUTTON in tree EXFORMAT */
X#define TRACKNUM 8 /* FTEXT in tree EXFORMAT */
X#define SEC9 12 /* BUTTON in tree EXFORMAT */
X#define SEC10 13 /* BUTTON in tree EXFORMAT */
X#define DISKNAME 14 /* FBOXTEXT in tree EXFORMAT */
X#define FORMAT 15 /* BUTTON in tree EXFORMAT */
X#define CANCEL 16 /* BUTTON in tree EXFORMAT */
X#define SS 20 /* BUTTON in tree EXFORMAT */
X#define DS 21 /* BUTTON in tree EXFORMAT */
X#define DRIVEA 25 /* BUTTON in tree EXFORMAT */
X#define DRIVEB 26 /* BUTTON in tree EXFORMAT */
X
X#define GO 1 /* form/dialog */
X#define GOTRACK 7 /* FTEXT in tree GO */
X#define GOSIDE 8 /* FTEXT in tree GO */
X#define BOX 9 /* TEXT in tree GO */
X#define BAR 10 /* BOXTEXT in tree GO */
X
X#define MAIN 2 /* form/dialog */
X#define MBFREE 3 /* FBOXTEXT in tree MAIN */
X#define MCLOCK 4 /* BUTTON in tree MAIN */
X#define MFORMAT 5 /* BUTTON in tree MAIN */
X#define MCANCEL 6 /* BUTTON in tree MAIN */
X#define MAKEDIR 7 /* BUTTON in tree MAIN */
X#define MINFOA 10 /* BUTTON in tree MAIN */
X#define MINFOB 11 /* BUTTON in tree MAIN */
X#define MERASEA 14 /* BUTTON in tree MAIN */
X#define MERASEB 15 /* BUTTON in tree MAIN */
X#define ABOUT 16 /* BUTTON in tree MAIN */
X
X#define INSERT 3 /* form/dialog */
X#define AINSERT 3 /* FTEXT in tree INSERT */
X#define OKINSERT 5 /* BUTTON in tree INSERT */
X#define NOINSERT 6 /* BUTTON in tree INSERT */
X
X#define DISKERRO 4 /* form/dialog */
X
X#define INTRO 5 /* form/dialog */
X
X#define CLOCK 6 /* form/dialog */
X#define TIME 4 /* FTEXT in tree CLOCK */
X#define TIMEOFF 5 /* BUTTON in tree CLOCK */
X#define TIMEON 6 /* BUTTON in tree CLOCK */
X#define DATE 9 /* FTEXT in tree CLOCK */
X#define DATEOFF 10 /* BUTTON in tree CLOCK */
X#define DATEON 11 /* BUTTON in tree CLOCK */
X#define CLOCKEXI 13 /* BUTTON in tree CLOCK */
X#define ALARM 15 /* FTEXT in tree CLOCK */
X#define ALARMON 16 /* BUTTON in tree CLOCK */
X#define ALARMOFF 18 /* BUTTON in tree CLOCK */
X#define SETTIME 19 /* BUTTON in tree CLOCK */
X
X#define DISKINFO 7 /* form/dialog */
X#define INFOTRAC 2 /* FTEXT in tree DISKINFO */
X#define INFOSECT 3 /* FTEXT in tree DISKINFO */
X#define INFOSIDE 4 /* FTEXT in tree DISKINFO */
X#define INFOFREE 6 /* FBOXTEXT in tree DISKINFO */
X#define INFOEXIT 7 /* BUTTON in tree DISKINFO */
X#define INFOAGAI 8 /* BUTTON in tree DISKINFO */
X#define INFONAME 10 /* FBOXTEXT in tree DISKINFO */
X
X#define ALERT1 8 /* form/dialog */
X
XSHAR_EOF
chmod 0600 ASSIST2.H || echo "restore of ASSIST2.H fails"
sed 's/^X//' << 'SHAR_EOF' > ASSIST2.MAK &&
Xkey.c
Xmegamax\mmlink.ttp key.o megamax\acc.l -o key.acc
SHAR_EOF
chmod 0600 ASSIST2.MAK || echo "restore of ASSIST2.MAK fails"
sed 's/^X//' << 'SHAR_EOF' > s2_temp_.tmp &&
Xbegin 600 ASSIST2.RSC
XM``$/4`M\#U`*N`JX`"0#N`M\&I``>``)`",````.`````!JT#@\.#R!&3U)-
SHAR_EOF
echo "End of part 1, continue with part 2"
echo "2" > s2_seq_.tmp
exit 0