[comp.sources.atari.st] v01i052: assist2 -- Desk accessory utility part01/02

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