home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 298.lha / PopInfo_v3.1 / PopInfo.c < prev    next >
C/C++ Source or Header  |  1980-12-04  |  23KB  |  833 lines

  1. /* PopInfo v3.1 © Copyright 1989 Jonathan Potter
  2.  
  3.    This program is Public Domain - use it, don't abuse it.
  4.  
  5.    Jon. */
  6.  
  7. #include "PopInfo.h"
  8.  
  9. void main(argc,argv)
  10. int argc;
  11. char *argv[];
  12. {
  13.     int message,code;
  14.     int wmess, tmp;
  15.     char d[8];
  16.     OpenAll();
  17.     CheckMemoryForViruses();
  18.     Window=(struct Window *) OpenWindow(&SWindow);
  19.     if (Window==NULL) CloseUp(10);
  20.     (void) SetTaskPri(FindTask((char *) 0), 20);
  21.     if (Window->IFont->tf_YSize>8)
  22.         mesg.ITextFont=&TopazText;
  23.     scr=Window->WScreen;
  24.     ScreenHeight=scr->Height;
  25.     ScreenWidth=scr->Width;
  26.     checkbbs=0;
  27.     if (argc>=1 && (strncmp(argv[1],"-n",2))==0) checkbbs=1;
  28.     numdevs=countdevices();
  29.     oldtop=10; oldleft=0; oldw=639; oldh=50+(9*numdevs);
  30.     maxnumdevs=(ScreenHeight-50)/9;
  31.     onumdevs=numdevs;
  32.  
  33.     for(;;) {
  34.         waitaround:
  35.         if (((struct Window *) IntuitionBase->ActiveWindow)!=Window && flag==1
  36.                 && popflag==0) goto inactivate;
  37.         if (flag==1) OnGadget(&popstaygad,Window,NULL);
  38.         wmess=Wait(WINDOWMESSAGE | TIMERMESSAGE);
  39.         if (wmess&TIMERMESSAGE) {
  40.             Msg=GetMsg(TimerPort);
  41.             if (flag==1) goto partialrefresh;
  42.             TimeReq.tr_time.tv_secs=0;
  43.             TimeReq.tr_time.tv_micro=1000000;
  44.             SendIO((char *) &TimeReq.tr_node);
  45.             goto waitaround;
  46.         }
  47.         Msg=(struct Message *) GetMsg(Window->UserPort);
  48.         message=Msg->Class;
  49.         code=Msg->Code;
  50.         ReplyMsg((struct Message *) Msg);
  51.         switch (message) {
  52.  
  53.             case CLOSEWINDOW:
  54.  
  55.                 CloseUp(0);
  56.  
  57.             case GADGETUP:
  58.  
  59.                 if (flag==1) {
  60.                     if (popflag==0) popflag=1;
  61.                     else popflag=0;
  62.                     goto waitaround;
  63.                 }
  64.                 flag=1;
  65.                 oldtop=Window->TopEdge;
  66.                 oldleft=Window->LeftEdge;
  67.                 CloseWindow(Window);
  68.                 numdevs=countdevices();
  69.                 if (numdevs!=onumdevs) {
  70.                     if (oldh==(50+(9*onumdevs))) oldh=50+(9*numdevs);
  71.                     onumdevs=numdevs;
  72.                 }
  73.                 if (numdevs>maxnumdevs) numdevs=maxnumdevs;
  74.                 MWindow.TopEdge=oldtop;
  75.                 MWindow.LeftEdge=oldleft;
  76.                 MWindow.Width=oldw;
  77.                 MWindow.Height=oldh;
  78.                 MWindow.MaxHeight=50+(9*numdevs);
  79.                 if (oldh==(50+(9*onumdevs)))
  80.                     MWindow.Height=50+(9*numdevs);
  81.                 if (ScreenHeight-oldtop<50+(9*numdevs) && onumdevs!=numdevs)
  82.                     MWindow.TopEdge=(ScreenHeight-(50+(9*numdevs)));
  83.                 if (oldleft>(ScreenWidth-oldw)) MWindow.LeftEdge=ScreenWidth-oldw;
  84.                 if (oldtop>(ScreenHeight-oldh)) MWindow.TopEdge=ScreenHeight-oldh;
  85.                 onumdevs=numdevs;
  86.                 Window=(struct Window *) OpenWindow(&MWindow);
  87.                 if (Window==NULL) CloseUp(10);
  88.                 SetWindowTitles(Window,-1L,wintit);
  89.                 refreshwindow:
  90.                 sbbflag=0;
  91.                 cidcmp(0);
  92.                 OffGadget(&popstaygad,Window,NULL);
  93.                 SetAPen(iprint,0);
  94.                 RectFill(iprint,6,10,Window->Width-3,Window->Height-11);
  95.                 RectFill(iprint,17,Window->Height-10,Window->Width-17,Window->Height-2);
  96.                 SetAPen(iprint,3);
  97.                 mesg.FrontPen=3;
  98.                 sprintf(txt,"Unit Bytes     Used      Free      Ers WPS SBB Name");
  99.                 PrintIText(iprint,&mesg,-4,1);
  100.                 mesg.FrontPen=2;
  101.                 sprintf(txt,"____ _________ _________ _________ ___ ___ ___ ______________________________");
  102.                 PrintIText(iprint,&mesg,-4,2);
  103.                 mesg.FrontPen=1;
  104.                 y=12;
  105.                 Forbid();
  106.                 devlist=(struct DeviceList *) BADDR(dosinfo->di_DevInfo);
  107.                 while (devlist) {
  108.                     if (devlist->dl_Type!=DLT_DEVICE) {
  109.                         devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
  110.                         continue;
  111.                     }
  112.                     conbstr((BPTR) devlist->dl_Name,devname);
  113.                     strcat(devname,":");
  114.                     if (devlist->dl_Task) {
  115.                         point1[0]=0;
  116.                         dnum=-1; nodisk=0; nondos=0; bbmess="N/A"; status="R/W";
  117.                         if (devname[0]==68 && devname[1]==70) dnum=devname[2]-48;
  118.                         if (dnum!=-1) {
  119.                             if (checkbbs==1) bbmess="N/C"; else bbmess="Yes";
  120.                             nodisk=diskpresent(dnum);
  121.                             if (nodisk==1) goto display;
  122.                             if (checkbbs!=1) {
  123.                                 ReadBlock(dnum);
  124.                                 point2=diskbuffer;
  125.                                 point1=diskbuffer;
  126.                                 if (point1[0]!=ID_DOS_DISK) {
  127.                                     nondos=2;
  128.                                     if (point1[0]==ID_UNREADABLE_DISK) nondos=1;
  129.                                     if (point1[0]==ID_KICKSTART_DISK) nondos=3;
  130.                                     goto display;
  131.                                 }
  132.                                 sum=0;
  133.                                 for (a=0;a<256;a++) {
  134.                                     lastsum=sum;
  135.                                     sum=sum+point2[a];
  136.                                     if (lastsum>sum) sum++;
  137.                                 }
  138.                                 if (sum!=0) {
  139.                                     nsbb[dnum]=0;
  140.                                     bbmess="NBB";
  141.                                     goto display;
  142.                                 }
  143.                                 point2=&diskbuffer[4];
  144.                                 for (x=0;x<39;x++) {
  145.                                     if (diskbuffer[x+8]!=bootblock[x+8]) {
  146.                                         nsbb[dnum]=1;
  147.                                         sbbflag=1;
  148.                                         bbmess="No";
  149.                                         break;
  150.                                     }
  151.                                 }
  152.                                 if ((CheckBlock(1))==FALSE) bbmess="VIR";
  153.                             }
  154.                         }
  155.                     display:
  156.                     if (nodisk==1) sprintf(txt,"%-4s No disk present in drive.", devname);
  157.                     else if (nondos==1)    sprintf(txt,"%-4s Unreadable disk.", devname);
  158.                     else if (nondos==2) sprintf(txt,"%-4s Not a DOS disk.", devname);
  159.                     else if (nondos==3)    sprintf(txt,"%-4s Kickstart disk.", devname);
  160.                     if (nodisk==0 && nondos==0) {
  161.                         if ((lock=Lock(devname,ACCESS_READ))==0) {
  162.                             nondos=1; goto display;
  163.                         }
  164.                         Info(lock,data);
  165.                         Examine(lock,finfo);
  166.                         if (data->id_DiskState==ID_VALIDATING)
  167.                             sprintf(txt,"%-4s Validating.", devname);
  168.                         else {
  169.                             volumename=finfo->fib_FileName;
  170.                             if ((strncmp(devname,"RAM:",4))==0 && volumename==NULL)
  171.                                 volumename="RAM Disk";
  172.                             if (data->id_DiskState==ID_WRITE_PROTECTED) status="R O";
  173.                             sprintf(txt,"%-4s %-9ld %-9ld %-9ld %-3ld %-3s %-3s %-30s",
  174.                                 devname,
  175.                                 data->id_BytesPerBlock*data->id_NumBlocks,
  176.                                 data->id_BytesPerBlock*data->id_NumBlocksUsed,
  177.                                 (data->id_BytesPerBlock*data->id_NumBlocks)-
  178.                                     (data->id_BytesPerBlock*data->id_NumBlocksUsed),
  179.                                 data->id_NumSoftErrors,
  180.                                 status,
  181.                                 bbmess,
  182.                                 volumename);
  183.                         }
  184.                     }
  185.                     PrintIText(iprint,&mesg,-4,y);
  186.                     if (nodisk==0 && nondos==0) {
  187.                         if (nsbb[dnum]>0) {
  188.                             sprintf(txt,"                                           %-3s",bbmess);
  189.                             if (nsbb[dnum]==1) mesg.FrontPen=2;
  190.                             else mesg.FrontPen=3;
  191.                             PrintIText(iprint,&mesg,-4,y);
  192.                             mesg.FrontPen=1;
  193.                             nsbb[dnum]=0;
  194.                         }
  195.                         UnLock(lock);
  196.                     }
  197.                     nondos=0; nodisk=0; dnum=0; y+=9;
  198.                 }
  199.             devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
  200.             }
  201.             Permit();
  202.             fast=FASTMEMORY;
  203.             chipt=CHIPMEMORY;
  204.             total=TOTALMEMORY;
  205.             getclk(d);
  206.             day=d[3];
  207.             month=d[2];
  208.             year=d[1]+80;
  209.             hours=d[4];
  210.             mins=d[5];
  211.             secs=d[6];
  212.             if (ScreenHeight==200 || ScreenHeight==400) {
  213.                 tmp=month; month=day; day=tmp;
  214.             }
  215.             y+=5;
  216.             mesg.FrontPen=2;
  217.             sprintf(txt,"            FREE MEMORY      :             :             :");
  218.             PrintIText(iprint,&mesg,-4,y);
  219.             mesg.FrontPen=3;
  220.             sprintf(txt,"                         FAST          CHIP         TOTAL");
  221.            PrintIText(iprint,&mesg,-4,y);
  222.             mesg.FrontPen=1;
  223.             sprintf(txt,"                              %-7ld       %-6ld        %-7ld",
  224.                 fast,chipt,total);
  225.             PrintIText(iprint,&mesg,-4,y);
  226.             mesg.FrontPen=3;
  227.             sprintf(txt,"                         TIME          DATE");
  228.             PrintIText(iprint,&mesg,-4,y+9);
  229.             mesg.FrontPen=2;
  230.             sprintf(txt,"                                :  :          /  /");
  231.             PrintIText(iprint,&mesg,-4,y+9);
  232.             mesg.FrontPen=1;
  233.             sprintf(txt,"                              %02d %02d %02d      %02d %02d %02d",
  234.                hours,mins,secs,day,month,year);
  235.             PrintIText(iprint,&mesg,-4,y+9);
  236.             RefreshGadgets(Window->FirstGadget,Window,NULL);
  237.             SizeWindow(Window,0,0);
  238.             OnGadget(&popstaygad,Window,NULL);
  239.             cidcmp(1);
  240.             goto waitaround;
  241.  
  242.             case RAWKEY:
  243.                 if (code!=0x40) goto waitaround;
  244.                 oldtop=Window->TopEdge;
  245.                 oldleft=Window->LeftEdge;
  246.                 oldh=Window->Height;
  247.                 oldw=Window->Width;
  248.                 SWindow.TopEdge=oldtop;
  249.                 SWindow.LeftEdge=oldleft;
  250.                 CloseWindow(Window);
  251.                 Window=(struct Window *) OpenWindow(&LWindow);
  252.                 ViewBoot(0);
  253.                 Window=(struct Window *) OpenWindow(&MWindow);
  254.                 if (Window==NULL) CloseUp(10);
  255.                 goto refreshwindow;
  256.  
  257.             case INACTIVEWINDOW:
  258.  
  259.                 inactivate:
  260.                 if (popflag==1) goto waitaround;
  261.                 if (flag==0) goto waitaround;
  262.                 flag=0;
  263.                 if (Window->TopEdge!=MWindow.TopEdge) oldtop=Window->TopEdge;
  264.                 if (Window->LeftEdge!=MWindow.LeftEdge) oldleft=Window->LeftEdge;
  265.                 oldh=Window->Height;
  266.                 oldw=Window->Width;
  267.                 CloseWindow(Window);
  268.                 SWindow.TopEdge=oldtop;
  269.                 SWindow.LeftEdge=oldleft;
  270.                 Window=(struct Window *) OpenWindow(&SWindow);
  271.                 if (Window==NULL) CloseUp(10);
  272.                 goto waitaround;
  273.  
  274.             case REFRESHWINDOW:
  275.  
  276.                 if (oldh!=Window->Height || oldw!=Window->Width) {
  277.                     numdevs=countdevices();
  278.                     WindowLimits(Window,0,0,0,(50+(9*numdevs)));
  279.                     oldh=Window->Height;
  280.                     oldw=Window->Width;
  281.                     goto refreshwindow;
  282.                 }
  283.                 goto waitaround;
  284.  
  285.             case DISKINSERTED:
  286.  
  287.                 if (flag==1)
  288.                     goto refreshwindow;
  289.                 goto waitaround;
  290.  
  291.             case DISKREMOVED:
  292.  
  293.                 if (flag==1) goto refreshwindow;
  294.                 goto waitaround;
  295.  
  296.             case MOUSEBUTTONS:
  297.  
  298.                 if (Msg->Code==MENUDOWN) goto refreshwindow;
  299.                 goto waitaround;
  300.  
  301.             default:
  302.             goto waitaround;
  303.         }
  304.  
  305.         partialrefresh:
  306.             RemoveGadget(Window,&popstaygad);
  307.             mesg.DrawMode=JAM2;
  308.             mesg.FrontPen=1;
  309.             fast=FASTMEMORY;
  310.             chipt=CHIPMEMORY;
  311.             total=TOTALMEMORY;
  312.             getclk(d);
  313.             day=d[3];
  314.             month=d[2];
  315.             year=d[1]+80;
  316.             hours=d[4];
  317.             mins=d[5];
  318.             secs=d[6];
  319.             if (ScreenHeight==200 || ScreenHeight==400) {
  320.                 tmp=month; month=day; day=tmp;
  321.             }
  322.             sprintf(txt,"%-7ld",fast);
  323.             PrintIText(iprint,&mesg,236,y);
  324.             sprintf(txt,"%-6ld",chipt);
  325.             PrintIText(iprint,&mesg,348,y);
  326.             sprintf(txt,"%-7ld",total);
  327.             PrintIText(iprint,&mesg,460,y);
  328.             sprintf(txt,"%02d",hours);
  329.             PrintIText(iprint,&mesg,236,y+9);
  330.             sprintf(txt,"%02d",mins);
  331.             PrintIText(iprint,&mesg,260,y+9);
  332.             sprintf(txt,"%02d",secs);
  333.             PrintIText(iprint,&mesg,284,y+9);
  334.             sprintf(txt,"%02d",day);
  335.             PrintIText(iprint,&mesg,348,y+9);
  336.             sprintf(txt,"%02d",month);
  337.             PrintIText(iprint,&mesg,372,y+9);
  338.             sprintf(txt,"%02d",year);
  339.             PrintIText(iprint,&mesg,396,y+9);
  340.             mesg.DrawMode=JAM1;
  341.             AddGadget(Window,&popstaygad,-1);
  342.             TimeReq.tr_time.tv_secs=0;
  343.             TimeReq.tr_time.tv_micro=1000000;
  344.             SendIO((char *) &TimeReq.tr_node);
  345.             if (onumdevs!=countdevices()) {
  346.                 numdevs=countdevices();
  347.                 MWindow.MaxHeight=50+(9*numdevs);
  348.                 if (Window->Height==(50+(9*onumdevs)))
  349.                     MWindow.Height=50+(9*numdevs);
  350.                 if (ScreenHeight-oldtop<50+(9*numdevs) && onumdevs!=numdevs)
  351.                 MWindow.TopEdge=(ScreenHeight-(50+(9*numdevs)));
  352.                 if (Window->TopEdge+(50+(9*numdevs))>ScreenHeight) 
  353.                     MoveWindow(Window,0,(0-((Window->TopEdge)-(ScreenHeight-(50+(9*numdevs))))));
  354.                 SizeWindow(Window,0,((50+(9*numdevs))-(Window->Height))); 
  355.                 onumdevs=numdevs;
  356.                 goto refreshwindow;
  357.             }
  358.             onumdevs=countdevices();
  359.             goto waitaround;
  360.     }
  361. }
  362.  
  363. OpenAll()
  364. {
  365.     int i;
  366.     extern USHORT *popgad1_chip, *popgad2_chip, *popstay1_chip, *popstay2_chip;
  367.     extern UBYTE *diskbuffer;
  368.     IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
  369.     if (IntuitionBase==NULL) CloseUp(20);
  370.     GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0);
  371.     if (GfxBase==NULL) CloseUp(25);
  372.     DosBase=(struct DosLibrary *) OpenLibrary("dos.library",0);
  373.     if (DosBase==NULL) CloseUp(30);
  374.     diskport=CreatePort(0,0);
  375.     if (diskport==NULL) CloseUp(35);
  376.     diskreq=CreateStdIO(diskport);
  377.     if (diskreq==NULL) CloseUp(40);
  378.     lock=(struct FileLock *) AllocMem(sizeof(struct FileLock),0);
  379.     if (lock==NULL) CloseUp(10);
  380.     data=(struct InfoData *) AllocMem(sizeof(struct InfoData),0);
  381.     if (data==NULL) CloseUp(10);
  382.     finfo=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),0);
  383.     if (finfo==NULL) CloseUp(10);
  384.     TimerPort=CreatePort("Timer Port",0);
  385.     if (TimerPort==NULL) CloseUp(45);
  386.     error=OpenDevice("timer.device",UNIT_VBLANK,(char *) &TimeReq,0);
  387.     if (error!=NULL) CloseUp(50);
  388.     TimeReq.tr_node.io_Message.mn_ReplyPort=TimerPort;
  389.     TimeReq.tr_node.io_Command=TR_ADDREQUEST;
  390.     TimeReq.tr_node.io_Flags=0;
  391.     TimeReq.tr_node.io_Error=0;
  392.     TimeReq.tr_time.tv_secs=0;
  393.     TimeReq.tr_time.tv_micro=1000000;
  394.     SendIO((char *) &TimeReq.tr_node);
  395.     rootnode=(struct RootNode *) DosBase->dl_Root;
  396.     dosinfo=(struct DosInfo *) BADDR(rootnode->rn_Info);
  397.     if ((popgad1_chip=(USHORT *)
  398.         AllocMem(sizeof(popgad1ImageData),MEMF_CHIP))==0) CloseUp(55);
  399.     if ((popgad2_chip=(USHORT *)
  400.         AllocMem(sizeof(popgad2ImageData),MEMF_CHIP))==0) CloseUp(60);
  401.     if ((popstay1_chip=(USHORT *)
  402.         AllocMem(sizeof(popstay1),MEMF_CHIP))==0) CloseUp(65);
  403.     if ((popstay2_chip=(USHORT *)
  404.         AllocMem(sizeof(popstay2),MEMF_CHIP))==0) CloseUp(70);
  405.     if ((diskbuffer=(USHORT *)
  406.         AllocMem(1024,MEMF_CHIP))==0) CloseUp(75);
  407.     for (i=0;i<80;i++) popgad1_chip[i]=popgad1ImageData[i];
  408.     for (i=0;i<80;i++) popgad2_chip[i]=popgad2ImageData[i];
  409.     for (i=0;i<9;i++) popstay1_chip[i]=popstay1[i];
  410.     for (i=0;i<9;i++) popstay2_chip[i]=popstay2[i];
  411.     popgad1Image.ImageData=popgad1_chip;
  412.     popgad2Image.ImageData=popgad2_chip;
  413.     pim1.ImageData=popstay1_chip;
  414.     pim2.ImageData=popstay2_chip;
  415.     return(0);
  416. }
  417.  
  418. CloseUp(err)
  419. {
  420.     extern USHORT *popgad1_chip, *popgad2_chip, *popstay1_chip, *popstay2_chip;
  421.     extern UBYTE *diskbuffer;
  422.     if (Window) CloseWindow(Window);
  423.     AbortIO((char *) &TimeReq.tr_node);
  424.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  425.     if (GfxBase) CloseLibrary(GfxBase);
  426.     if (DosBase) CloseLibrary(DosBase);
  427.     if (popgad1_chip!=0) FreeMem(popgad1_chip,(sizeof(popgad1ImageData),MEMF_CHIP));
  428.     if (popgad2_chip!=0) FreeMem(popgad2_chip,(sizeof(popgad2ImageData),MEMF_CHIP));
  429.     if (popstay1_chip!=0) FreeMem(popstay1_chip,(sizeof(popstay1),MEMF_CHIP));
  430.     if (popstay2_chip!=0) FreeMem(popstay2_chip,(sizeof(popstay2),MEMF_CHIP));
  431.     if (diskbuffer!=0) FreeMem(diskbuffer,(1024,MEMF_CHIP));
  432.     CloseDevice(&TimeReq);
  433.     DeletePort(TimerPort);
  434.     DeletePort(diskport);
  435.     DeleteStdIO(diskreq);
  436.     OpenWorkBench();
  437.     if (err!=0) DisplayBeep(NULL);
  438.     exit(err);
  439.     return(0);
  440. }
  441.  
  442. conbstr(in,out)
  443. BSTR in;
  444. char *out;
  445. {
  446.     register UBYTE *ch;
  447.     register int len,i;
  448.     ch=(UBYTE *) BADDR(in);
  449.     len=(int) *(ch++);
  450.     len=(len>20)?20:len;
  451.     for (i=0;i<len;i++) out[i]=*(ch++);
  452.     out[i]='\0';
  453.     return(0);
  454. }
  455.  
  456. countdevices()
  457. {
  458.     int devices;
  459.     devices=0;
  460.     Forbid();
  461.     rootnode=(struct RootNode *) DosBase->dl_Root;
  462.     dosinfo=(struct DosInfo *) BADDR(rootnode->rn_Info);
  463.     devlist=(struct DeviceList *) BADDR(dosinfo->di_DevInfo);
  464.     while (devlist) {
  465.         if (devlist->dl_Type!=NULL) {
  466.             devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
  467.             continue;
  468.         }
  469.         if (DLT_DEVICE!=NULL || devlist->dl_Task) ++devices;
  470.         devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
  471.     }
  472.     Permit();
  473.     return(devices);
  474. }
  475.  
  476. diskpresent(drive)
  477. int drive;
  478. {
  479.     int nd;
  480.     nd=0;
  481.     error=OpenDevice("trackdisk.device",drive,diskreq,0);
  482.     diskreq->io_Command=TD_CHANGESTATE;
  483.     DoIO(diskreq);
  484.     if (diskreq->io_Actual!=0) nd=1;
  485.     CloseDevice(diskreq);
  486.     return(nd);
  487. }
  488.  
  489. ReadBlock(drive)
  490. int drive;
  491. {
  492.     int l;
  493.     for (l=0;l<1024;l++) diskbuffer[l]=0;
  494.     error=OpenDevice("trackdisk.device",drive,diskreq,0);
  495.     diskreq->io_Command=CMD_READ;
  496.     diskreq->io_Data=diskbuffer;
  497.     diskreq->io_Length=1024;
  498.     diskreq->io_Offset=0;
  499.     DoIO(diskreq);
  500.     diskreq->io_Length=0;
  501.     diskreq->io_Command=TD_MOTOR;
  502.     DoIO(diskreq);
  503.     CloseDevice(diskreq);
  504.     return(0);
  505. }
  506.  
  507. cidcmp(state)
  508. int state;
  509. {
  510.     if (state==0) {
  511.         ModifyIDCMP(Window,NULL);
  512.         return(0);
  513.     }
  514.     ModifyIDCMP(Window,CLOSEWINDOW|INACTIVEWINDOW|GADGETUP|DISKINSERTED|
  515.         RAWKEY|DISKREMOVED|REFRESHWINDOW|MOUSEBUTTONS);
  516.     return(0);
  517. }
  518.  
  519. ViewBoot(c)
  520. int c;
  521. {
  522.     struct Gadget *gad;
  523.     int gadgetid, block;
  524.     CheckDriveGadgets();
  525.     nsbb[c]=0;
  526.     y=0;
  527.     ReadBlock(c);
  528.     DisplayBoot(0); block=0; blktext.IText="BLK1"; CheckBlock(0);
  529.     RefreshGadgets(&blkgadget,Window,NULL);
  530.     for (;;) {
  531.         Wait(1<<Window->UserPort->mp_SigBit);
  532.         while (Msg=GetMsg(Window->UserPort)) {
  533.             gad=(struct Gadget *) Msg->IAddress;
  534.             gadgetid=gad->GadgetID;
  535.             ReplyMsg(Msg);
  536.             switch (gadgetid) {
  537.                 case EXIT:
  538.                     CloseWindow(Window);
  539.                     return(FALSE);
  540.                     break;
  541.                 case BLK:
  542.                     if (block==0) block=1; else block=0;
  543.                     if (block==1) blktext.IText="BLK0"; else blktext.IText="BLK1";
  544.                     RefreshGadgets(&blkgadget,Window,NULL);
  545.                     DisplayBoot(block);
  546.                     break;
  547.                 case DF0:
  548.                     ReadBlock(0); c=0;
  549.                     DisplayBoot(0); block=0; blktext.IText="BLK1";
  550.                     RefreshGadgets(&blkgadget,Window,NULL);
  551.                     CheckBlock(0);
  552.                     break;
  553.                 case DF1:
  554.                     ReadBlock(1); c=1;
  555.                     DisplayBoot(0); block=0; blktext.IText="BLK1"; 
  556.                     RefreshGadgets(&blkgadget,Window,NULL);
  557.                     CheckBlock(0);
  558.                     break;
  559.                 case DF2:
  560.                     ReadBlock(2); c=2;
  561.                     DisplayBoot(0); block=0; blktext.IText="BLK1"; 
  562.                     RefreshGadgets(&blkgadget,Window,NULL);
  563.                     CheckBlock(0);
  564.                     break;
  565.                 case DF3:
  566.                     ReadBlock(3); c=3;
  567.                     DisplayBoot(0); block=0; blktext.IText="BLK1"; 
  568.                     RefreshGadgets(&blkgadget,Window,NULL);
  569.                     CheckBlock(0);
  570.                     break;
  571.                 case WIPE:
  572.                     WipeBoot(c);
  573.                     ReadBlock(c);
  574.                     DisplayBoot(0); block=0; blktext.IText="BLK1"; 
  575.                     RefreshGadgets(&blkgadget,Window,NULL);
  576.                     CheckBlock(0);
  577.                     break;
  578.                 case SAVE:
  579.                     SaveBoot();
  580.                     break;
  581.                 case LOAD:
  582.                     LoadBoot(c);
  583.                     ReadBlock(c);
  584.                     DisplayBoot(0); block=0; blktext.IText="BLK1";
  585.                     RefreshGadgets(&blkgadget,Window,NULL);
  586.                     CheckBlock(0);
  587.                     break;
  588.                 default:
  589.                     break;
  590.             }
  591.         }
  592.     }
  593.     return(0);
  594. }
  595.  
  596. DisplayBoot(which)
  597. int which;
  598. {
  599.     int a,s;
  600.     if (which==0) a=0; else a=512; s=a;
  601.     SetAPen(iprint,0);
  602.     RectFill(iprint,5,2,579,140);
  603.     RectFill(iprint,5,130,637,198);
  604.     SetAPen(iprint,1);
  605.     for (y=-9;y<=111;y=y+8) {
  606.         sprintf(txt,"%02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x",
  607.             diskbuffer[a],diskbuffer[a+1],diskbuffer[a+2],
  608.             diskbuffer[a+3],diskbuffer[a+4],diskbuffer[a+5],
  609.             diskbuffer[a+6],diskbuffer[a+7],diskbuffer[a+8],
  610.             diskbuffer[a+9],diskbuffer[a+10],diskbuffer[a+11],
  611.             diskbuffer[a+12],diskbuffer[a+13],diskbuffer[a+14],
  612.             diskbuffer[a+15]);
  613.         PrintIText(iprint,&mesg,0,y);
  614.         sprintf(txt,"%02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x",
  615.             diskbuffer[a+16],diskbuffer[a+17],diskbuffer[a+18],
  616.             diskbuffer[a+19],diskbuffer[a+20],diskbuffer[a+21],
  617.             diskbuffer[a+22],diskbuffer[a+23],diskbuffer[a+24],
  618.             diskbuffer[a+25],diskbuffer[a+26],diskbuffer[a+27],
  619.             diskbuffer[a+28],diskbuffer[a+29],diskbuffer[a+30],
  620.             diskbuffer[a+31]);
  621.         PrintIText(iprint,&mesg,288,y);
  622.         a+=32;
  623.     }
  624.     Move(iprint,10,140);
  625.     Text(iprint,&diskbuffer[s],78);
  626.     Move(iprint,10,149);
  627.     Text(iprint,&diskbuffer[s+78],78);
  628.     Move(iprint,10,158);
  629.     Text(iprint,&diskbuffer[s+156],78);
  630.     Move(iprint,10,167);
  631.     Text(iprint,&diskbuffer[s+234],78);
  632.     Move(iprint,10,176);
  633.     Text(iprint,&diskbuffer[s+312],78);
  634.     Move(iprint,10,185);
  635.     Text(iprint,&diskbuffer[s+390],78);
  636.     Move(iprint,141,194);
  637.     Text(iprint,&diskbuffer[s+468],44);
  638.     return(0);
  639. }
  640.  
  641. WipeBoot(c)
  642. int c;
  643. {
  644.     error=simplerequest(Window,"Really install this disk?",-3,-3,"INSTALL","CANCEL");
  645.     if (error==FALSE) return(0);
  646.     error=OpenDevice("trackdisk.device",c,diskreq,0);
  647.     tryagain:
  648.     diskreq->io_Command=TD_PROTSTATUS;
  649.     DoIO(diskreq);
  650.     if (diskreq->io_Actual!=0) {
  651.         error=simplerequest(Window,"Disk is write protected",-2,-2,"TRY AGAIN","CANCEL");
  652.         if (error==TRUE) goto tryagain;
  653.         CloseDevice(diskreq);
  654.         return(0);
  655.     }
  656.     for (x=0;x<1024;x++)
  657.         diskbuffer[x]=0;
  658.     CopyMem(bootblock,diskbuffer,50);
  659.     diskreq->io_Length=1024;
  660.     diskreq->io_Data=&diskbuffer[0];
  661.     diskreq->io_Command=CMD_WRITE;
  662.     diskreq->io_Offset=0;
  663.     DoIO(diskreq);
  664.     diskreq->io_Command=CMD_UPDATE;
  665.     DoIO(diskreq);
  666.     diskreq->io_Command=TD_MOTOR;
  667.     diskreq->io_Length=0;
  668.     DoIO(diskreq);
  669.     nsbb[dnum]=0;
  670.     return(0);
  671. }
  672.  
  673. SaveBoot()
  674. {
  675.     opensavefile:
  676.     filename=gf(Window,"Enter filename for Save",170,70);
  677.     if (filename==NULL) return(0);
  678.     bbsavefile=fopen(filename,"w");
  679.     if (bbsavefile==NULL) {
  680.         error=simplerequest(Window,"Can't open specified file",-2,-2,"TRY AGAIN","CANCEL");
  681.         if (error==FALSE) return(0);
  682.         goto opensavefile;
  683.     }
  684.     for (x=0;x<1024;x++)
  685.     putc(diskbuffer[x],bbsavefile);
  686.     fclose(bbsavefile);
  687.     return(0);
  688. }
  689.  
  690. LoadBoot(unit)
  691. int unit;
  692. {
  693.     int x;
  694.  
  695.     openloadfile:
  696.     filename=gf(Window,"Enter filename for Load",170,70);
  697.     if (filename==NULL) return(0);
  698.     bbsavefile=fopen(filename,"r");
  699.     if (bbsavefile==NULL) {
  700.         error=simplerequest(Window,"Can't open specified file",-2,-2,"TRY AGAIN","CANCEL");
  701.         if (error==FALSE) return(0);
  702.         goto openloadfile;
  703.     }
  704.     for (x=0;x<1024;x++)
  705.         diskbuffer[x]=getc(bbsavefile);
  706.     fclose(bbsavefile);
  707.     error=OpenDevice("trackdisk.device",unit,diskreq,0);
  708.     tryagain:
  709.     diskreq->io_Command=TD_PROTSTATUS;
  710.     DoIO(diskreq);
  711.     if (diskreq->io_Actual!=0) {
  712.         error=simplerequest(Window,"Disk is write protected",-2,-2,"TRY AGAIN","CANCEL");
  713.         if (error==TRUE) goto tryagain;
  714.         CloseDevice(diskreq);
  715.         return(0);
  716.     }
  717.     error=simplerequest(Window,"Really write this bootblock?",-3,-3,"WRITE IT","CANCEL");
  718.     if (error==FALSE) {
  719.         CloseDevice(diskreq);
  720.         return(0);
  721.     }
  722.     diskreq->io_Length=1024;
  723.     diskreq->io_Data=&diskbuffer[0];
  724.     diskreq->io_Command=CMD_WRITE;
  725.     diskreq->io_Offset=0L;
  726.     DoIO(diskreq);
  727.     diskreq->io_Command=CMD_UPDATE;
  728.     DoIO(diskreq);
  729.     diskreq->io_Length=0;
  730.     diskreq->io_Command=TD_MOTOR;
  731.     DoIO(diskreq);
  732.     CloseDevice(diskreq);
  733.     return(0);
  734. }
  735.  
  736. CheckDriveGadgets()
  737. {
  738.     int c;
  739.     OnGadget(&df0gadget,Window,NULL);
  740.     OnGadget(&df1gadget,Window,NULL);
  741.     OnGadget(&df2gadget,Window,NULL);
  742.     OnGadget(&df3gadget,Window,NULL);
  743.     for (c=0;c<4;c++) {
  744.         error=OpenDevice("trackdisk.device",c,diskreq,0);
  745.         if (error!=0) {
  746.             switch (c) {
  747.                 case 0:
  748.                     OffGadget(&df0gadget,Window,NULL);
  749.                     break;
  750.                 case 1:
  751.                     OffGadget(&df1gadget,Window,NULL);
  752.                     break;
  753.                 case 2:
  754.                     OffGadget(&df2gadget,Window,NULL);
  755.                     break;
  756.                 case 3:
  757.                     OffGadget(&df3gadget,Window,NULL);
  758.                     break;
  759.                 default:
  760.                     break;
  761.             }
  762.         }
  763.         else CloseDevice(diskreq);
  764.     }
  765.     return(0);
  766. }
  767.  
  768. CheckBlock(state)
  769. int state;
  770. {
  771.     nsbb[dnum]=0;
  772.     if (diskbuffer[8]=='C' &&
  773.             diskbuffer[9]=='H' &&
  774.             diskbuffer[10]=='W' &&
  775.             diskbuffer[11]=='!') nsbb[dnum]=2;
  776.     if (diskbuffer[43]=='9' &&
  777.             diskbuffer[44]=='.' &&
  778.             diskbuffer[45]=='8' &&
  779.             diskbuffer[46]=='7') nsbb[dnum]=3;
  780.     if (diskbuffer[192]=='D' &&
  781.             diskbuffer[193]=='A' &&
  782.             diskbuffer[194]=='S' &&
  783.             diskbuffer[195]=='A')    nsbb[dnum]=4;
  784.     if (diskbuffer[42]=='N' &&
  785.             diskbuffer[43]=='o' &&
  786.             diskbuffer[44]=='r' &&
  787.             diskbuffer[45]=='t') nsbb[dnum]=5;
  788.     if (diskbuffer[14]=='I' &&
  789.             diskbuffer[15]=='D' &&
  790.             diskbuffer[16]=='9') nsbb[dnum]=6;
  791.     if (diskbuffer[56]=='G' &&
  792.             diskbuffer[188]=='S' &&
  793.             diskbuffer[507]=='d' &&
  794.             diskbuffer[45]=='P') nsbb[dnum]=7;
  795.     if (diskbuffer[64]==0xff &&
  796.             diskbuffer[65]==0xa0 &&
  797.             diskbuffer[66]==0x20 &&
  798.             diskbuffer[67]==0x40)    nsbb[dnum]=8;
  799.     if (diskbuffer[288]==0x33 &&
  800.             diskbuffer[289]==0xfc &&
  801.             diskbuffer[290]==0xf6 &&
  802.             diskbuffer[291]==0xd5) nsbb[dnum]=9;
  803.     if (diskbuffer[336]==0x66 &&
  804.             diskbuffer[337]==0x62 &&
  805.             diskbuffer[338]==0x48 &&
  806.             diskbuffer[339]==0xe7) nsbb[dnum]=10;
  807.     if (diskbuffer[112]==0x41 &&
  808.             diskbuffer[113]==0xfa &&
  809.             diskbuffer[114]==0x03 &&
  810.             diskbuffer[115]==0x5e) nsbb[dnum]=11;
  811.     if (diskbuffer[64]==0x03 &&
  812.             diskbuffer[65]==0x61 &&
  813.             diskbuffer[66]==0x34 &&
  814.             diskbuffer[67]==0x3c) nsbb[dnum]=12;
  815.     if (diskbuffer[464]==0x83 &&
  816.             diskbuffer[465]==0x35 &&
  817.             diskbuffer[466]==0x3e &&
  818.             diskbuffer[467]==0xf0) nsbb[dnum]=13;
  819.     if (point1[84]==0x000100bf) nsbb[dnum]=14;
  820.     if (point1[84]==0x3fff2c78) nsbb[dnum]=15;
  821.     if (point1[16]==0x4240323c) nsbb[dnum]=16;
  822.     if (point1[16]==0x0007ec1a) nsbb[dnum]=17;
  823.     if (nsbb[dnum]==0) return(TRUE);
  824.     if (state==1) return(FALSE);
  825.     CWindow=(struct Window *) OpenWindow(&WWindow);
  826.     Move(cprint,25,17);
  827.     Text(cprint,virusdesc[(nsbb[c]-1)],30);
  828.     Wait(1<<CWindow->UserPort->mp_SigBit);
  829.     nsbb[dnum]=0;
  830.     CloseWindow(CWindow);
  831.     return(TRUE);
  832. }
  833.