home *** CD-ROM | disk | FTP | other *** search
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <exec/devices.h>
- #include <exec/execbase.h>
- #include <intuition/intuition.h>
- #include <intuition/intuitionbase.h>
- #include <devices/trackdisk.h>
- #include <libraries/dos.h>
- #include <libraries/dosextens.h>
- #include <stdio.h>
- #include <string.h>
- #include "BootBase.h"
- #include "rawkey.h"
-
- char IDstring[47] = {"BootBase V2.3 - Steven Lagerweij 5-apr-90"};
-
- #define BIG 1500L
- #define READ 1005L
- #define WRITE 1006L
- #define BUFFER 1024
- #define NUMHEADS 2
- #define PROTECT "Disk is write-protected "
- #define NODISK "No disk present. "
- #define NOMEM "Not enough memory. "
- #define NOEXT "Can't CreateExtIo(). "
- #define NOPORT "Can't CreatePort(). "
- #define NOPROB "No failures. "
- #define NODEV "Drive is occupied! "
- #define EMPTY " "
- #define CANCELED 10
- #define TOSHORT 20
- #define NOMATCH 30
- #define MATCH 40
- #define EXTSTAND 50
- #define NOINFO 60
- #define NOWIN 70
-
- char seldr[8] = {" DFx "}; /* active gadget text*/
-
-
- extern struct ExecBase *SysBase; /* Libraries */
- extern struct DosLibrary *DOSBase;
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
-
- struct Window *OpenWindow();
- void *OpenLibrary();
- extern struct MsgPort *CreatePort();
- extern struct IORequest *CreateExtIO();
- struct Message *GetMsg();
-
- struct MsgPort *diskport;
- struct IOExtTD *diskreq;
- struct Screen *screen;
- struct Window *FirstWindow,*wlist,*reqwin;
- struct IntuiMessage *message;
- struct Gadget *GadgetPtr;
- struct IntuiText DriveText =
- { 2,3,JAM2, 0,0, NULL, &seldr[0], NULL };
-
-
- ULONG MessageClass;
- USHORT code, GadgetID;
- BYTE *diskbuffer,Map[BUFFER]; /* Buffer for bootblock and file */
- ULONG diskchangecount,remcount[4]; /* Diskchangecounters to see which drive changed disk*/
- long drive = 0,availdrives[4]; /* Current drive and available drives */
-
-
- char *ReqTexts[20] = { /* Requester texts */
- "You are about to rewrite ",
- "this disk's bootblock ",
- "Are you sure you want this ?",
- "Do you wish to quit ?",
- "There are windows/programs",
- "which are NOT opened by me",
- "Do you wish to QUIT or",
- "REMOVE them first",
- "Select YES to quit",
- "NO to cancel",
- };
-
- BYTE standard[55] = { /* Code for standard bootblock */
- 0x44,0x4f,0x53,0x00,0xc0,0x20,0x0f,0x19,0x00,0x00,0x03,0x70,
- 0x43,0xfa,0x00,0x18,0x4e,0xae,0xff,0xa0,0x4a,0x80,0x67,0x0a,
- 0x20,0x40,0x20,0x68,0x00,0x16,0x70,0x00,0x4e,0x75,0x70,0xff,
- 0x60,0xfa,0x64,0x6f,0x73,0x2e,0x6c,0x69,0x62,0x72,0x61,0x72,
- 0x79
- }; /* the rest is filled with zeros */
-
- char file[64]; /* Filereq */
- char readdir[64] = {"BBS:"}; /* Filereq */
- char writedir[64] = {"BBS:"}; /* FileReq */
- char currcomment[81], Attached[128], tmp[100]; /* Comment, Filepath, temp store */
- char kindofbb[100] = {" "}; /* BB Name */
- char *Readptr,*Writeptr; /* Pointers for file operation */
- char CompPath[5] = {"BBS:"}; /* Logical assignment/path */
- char *LeftMouse = (char *) 0xBFE001; /* To test leftbutton directly, without intuitionmessage */
-
- short comflag = FALSE; /* Comment on ? */
- short AutoCompare = FALSE; /* Flag for autocompare function */
- short AutoRead = FALSE; /* Flag for autoread bb from inserted disk */
- short setupcnt = TRUE; /* Little flag to get diskchangecounts at startup */
- short PAL = TRUE; /* PAL machine ? (see main()) */
- short VisualComp = FALSE; /* If this flag is set the graphics will be printed */
- short isthereabb = FALSE; /* Is there a bootblock in buffer? - flag */
-
- VOID _main()
- {
- if(SysBase->VBlankFrequency != 0x32) PAL = FALSE;
-
- /* Find available drives */
- GadgetPtr = &StringGadget;
- if(FindUnit("DF0:"))
- { GadgetPtr->NextGadget = &df0gag; GadgetPtr = &df0gag; availdrives[0] = TRUE; }
- else availdrives[0] = FALSE;
- if(FindUnit("DF1:"))
- { GadgetPtr->NextGadget = &df1gag; GadgetPtr = &df1gag; availdrives[1] = TRUE; }
- else availdrives[1] = FALSE;
- if(FindUnit("DF2:"))
- { GadgetPtr->NextGadget = &df2gag; GadgetPtr = &df2gag; availdrives[2] = TRUE; }
- else availdrives[2] = FALSE;
- if(FindUnit("DF3:"))
- { GadgetPtr->NextGadget = &df3gag; availdrives[3] = TRUE; }
- else availdrives[3] = FALSE;
- if(!PAL)
- {
- FirstNewWindow.Height = 200;
- ns.Height = 200;
- }
- Open_All(); /* Windows screen etc opened in here */
-
- DiskIns(); setupcnt = FALSE; /* Get change counts */
- drive = 1; GadgetID = 14; DriveSelect(); /* DF0 Active */
-
- LayOut(); /* Build screen outlay*/
- for(;;)
- {
- if ((message = (struct IntuiMessage *)
- GetMsg(FirstWindow->UserPort)) == NULL)
- {
- Wait(1<<FirstWindow->UserPort->mp_SigBit);
- continue;
- }
- MessageClass = message->Class;
- code = message->Code;
- GadgetPtr = (struct Gadget *) message->IAddress;
- GadgetID = GadgetPtr->GadgetID;
- ReplyMsg(message);
-
-
- switch (MessageClass)
- {
- case MOUSEBUTTONS: if(code == MENUDOWN)
- Help(FirstWindow->MouseX,FirstWindow->MouseY);
- break;
- case RAWKEY : Do_RawKey(code);
- break;
- case GADGETUP : GadgetActs();
- break;
- case DISKINSERTED :
- if(DiskIns() == 0)
- {
- if(AutoRead) ErrPrint(ShowBootBlock());
- }
- break;
-
- }
- }
- }
-
-
- Open_All()
- {
-
- if((diskbuffer = (BYTE *)
- AllocMem(BUFFER,MEMF_CHIP)) == NULL)
- {
- printf("Couldn't not allocate chip-memory for diskbuffer\n");
- exit(FALSE);
- }
- if (!(IntuitionBase = (struct IntuitionBase *)
- OpenLibrary("intuition.library", 0L)))
- {
- printf("Intuition Library failure!\n");
- Close_All();
- }
- if((GfxBase = (struct GfxBase *)
- OpenLibrary("graphics.library",0)) == NULL)
- {
- printf("Can't open Graphics library!\n");
- Close_All();
- }
- if(!(screen=(struct Screen *)OpenScreen(&ns)))
- {
- printf("Can't open screen!\n");
- Close_All();
- }
- FirstNewWindow.Screen=screen;
- ReqWindow.Screen =screen;
-
- if (!(FirstWindow = (struct Window *)OpenWindow(&FirstNewWindow)))
- {
- printf("Can't open Window!\n");
- Close_All();
- }
- return(0);
- }
-
- Close_All() /* Everything that is opened will be closed */
- {
- short morewins = FALSE;
- CLD();
-
- if(screen)
- {
- for(wlist = screen->FirstWindow;wlist != NULL;wlist = wlist->NextWindow)
- {
- if(wlist != FirstWindow)
- {
- morewins++;
- Locate(4+morewins,2);
- sprintf(&tmp[0],"Error first remove window/program: %s",
- (UBYTE *)wlist->Title);
- Print(&tmp[0]);
- }
- }
- }
- if((morewins) && (!AreYouSure(4,6,3))) return(FALSE);
- if(diskbuffer) FreeMem(diskbuffer,BUFFER);
- if (FirstWindow) CloseWindow(FirstWindow);
- if (GfxBase) CloseLibrary(GfxBase);
- if (IntuitionBase) CloseLibrary(IntuitionBase);
- if (screen) CloseScreen(screen);
- exit(0);
- }
-
-
- Locate(y,x) /* To locate the cursor for text printing */
- short y,x;
- {
- short rx,ry; /* Real x and y */
- rx=x*8;
- ry=y*8;
- ry=ry+16;
- if(ry<24) ry=24;
- if(ry>248) ry=248;
- if(rx<1) rx=1;
- if(rx>632) rx=632;
-
- if((!PAL) && (ry > 200)) ry = 200;
- Move(FirstWindow->RPort,rx,ry);
- return(0);
- }
-
- Print(line) /* Print a string */
- char line[100];
- {
- Text(FirstWindow->RPort,&line[0],strlen(&line[0]));
- return(0);
- }
-
- ErrPrint(line) /* Print string at specific position - errors fe. */
- char *line;
- {
- SetColor(1,0); Locate(3,12);
- Print(" ");
- Locate(3,12); Print(&line[0]);
- return(0);
- }
-
- SetColor(f,b)
- short f,b; /* Voor en achtergrondkleur */
- {
- if(f<0 || f>3) f=1;
- if(b<0 || b>3) b=0;
- SetAPen(FirstWindow->RPort,f);
- SetBPen(FirstWindow->RPort,b);
- return(0);
- }
-
- ReadCylSec(cyl,sec,hd) /* Read 1024(BUFFER) bytes from disk */
- SHORT cyl,sec,hd;
- {
- LONG offset;
-
- diskreq->iotd_Req.io_Length = BUFFER;
- diskreq->iotd_Req.io_Data = (APTR)diskbuffer;
- diskreq->iotd_Req.io_Command = ETD_READ;
- diskreq->iotd_Count = diskchangecount;
- offset = TD_SECTOR * (sec + NUMSECS * hd + NUMSECS * NUMHEADS * cyl);
- diskreq->iotd_Req.io_Offset = offset;
- DoIO(diskreq);
- return(0);
- }
-
- MotorOn() /* Drive motor on */
- {
- diskreq->iotd_Req.io_Length = 1;
- diskreq->iotd_Req.io_Command = TD_MOTOR;
- DoIO(diskreq);
- return(0);
- }
-
- MotorOff() /* Drive motor off */
- {
- diskreq->iotd_Req.io_Length = 0;
- diskreq->iotd_Req.io_Command = TD_MOTOR;
- DoIO(diskreq);
- return(0);
- }
-
- struct IORequest *CreateExtIO(ioReplyPort,size) /* create extended I/O */
- struct MsgPort *ioReplyPort;
- LONG size;
- {
- struct IORequest *ioReq;
-
- if(ioReplyPort == 0)
- return((struct IORequest *) 0);
-
- ioReq = (struct IORequest *)AllocMem (size,MEMF_CLEAR | MEMF_PUBLIC);
- if(ioReq==0)
- return((struct IORequest *) 0);
- ioReq->io_Message.mn_Node.ln_Type = NT_MESSAGE;
- ioReq->io_Message.mn_Node.ln_Pri = 0;
- ioReq->io_Message.mn_ReplyPort = ioReplyPort;
- return(ioReq);
- }
-
- DeleteExtIO(ioExt,size) /* Remove Extendend I/O */
- struct IORequest *ioExt;
- LONG size;
- {
- ioExt->io_Message.mn_Node.ln_Type = 0xff;
- ioExt->io_Device = (struct Device *) -1;
- ioExt->io_Unit = (struct Unit *) -1;
- FreeMem(ioExt,size);
- return(0);
- }
-
-
- ShowBootBlock() /* Read bootblock from disk and show it on screen */
- {
- short readerr,tst;
- char oneline[100];
-
- if((diskport = CreatePort(0,0)) == 0)
- { return(NOPORT); };
-
- if((diskreq = (struct IOExtTD *)
- CreateExtIO(diskport,sizeof(struct IOExtTD))) == NULL)
- { DeletePort(diskport); return(NOEXT);};
-
- if(OpenDevice(TD_NAME,drive,diskreq,0))
- {
- DeleteExtIO(diskreq,sizeof(struct IOExtID));
- DeletePort(diskport);
- return(NODEV);
- }
- diskreq->iotd_Req.io_Command = TD_CHANGESTATE;
- DoIO(diskreq);
- if(diskreq->iotd_Req.io_Actual != 0)
- {
- CloseDevice(diskreq);
- DeleteExtIO(diskreq,sizeof(struct IOExtTD));
- DeletePort(diskport);
- return(NODISK);
- }
- diskreq->iotd_Req.io_Command = TD_CHANGENUM;
- DoIO(diskreq);
- diskchangecount = diskreq->iotd_Req.io_Actual;
- remcount[drive] = diskchangecount;
- MotorOn();
- ReadCylSec(0,0,0);
- readerr=diskreq->iotd_Req.io_Error;
- MotorOff();
- if(readerr != 0)
- {
- CLD();
- sprintf(&oneline[0],"Read Error: %d",readerr);
- SetColor(3,0);
- if(isthereabb) PrintCurrentBB();
- return(&oneline[0]);
- }
- else
- {
- CLD();
- tst = CheckIfStandard();
-
- if(tst == 1) sprintf(&kindofbb[0],"Standard 1.2/1.3 ");
- else if(tst == 2) sprintf(&kindofbb[0],"Do nothing bootblock ");
- else sprintf(&kindofbb[0],"Not identified ! ");
- isthereabb = TRUE;
- SetColor(1,0);
- PrintCurrentBB();
- if((AutoCompare) && (!tst)) DoComparing();
- else Grafiek(1);
- StringBuffer[0] = '\0'; UndoBuffer[0] = '\0';
- RefreshGadgets(&StringGadget,FirstWindow,NULL);
- }
- CloseDevice(diskreq);
- DeleteExtIO(diskreq,sizeof(struct IOExtTD));
- DeletePort(diskport);
- LayOut();
- return(NOPROB);
- }
-
- CLD()
- {
- SetColor(0,0);
- RectFill(FirstWindow->RPort,12,47,528,178);
- SetColor(1,0);
- return(0);
- }
-
- PrintCurrentBB()
- {
- char oneline[100];
- short ypos = 5,xpos;
- short bufpos = 0;
- int kar;
- for(bufpos=0;bufpos<1024;bufpos+=64)
- {
- for(xpos=0;xpos<64;xpos++)
- {
- kar = diskbuffer[(bufpos+xpos)];
- if((kar > 31) && (kar < 217)) oneline[xpos] = kar;
- else oneline[xpos] = '.';
- }
- oneline[64] = '\0';
- Locate(ypos,2); Print(&oneline[0]);
- ypos++;
- }
- return(0);
- }
-
- LayOut()
- {
- SetColor(2,0);
- DrawBox(10,45,530,180); /* Box around bootblock */
- DrawBox(11,46,529,179);
-
- DrawBox(10,13,530,45); /* Box around error messages */
- DrawBox(11,14,529,44);
-
- DrawBox(541,17,639,43); /* Box around read/write boot gags */
- DrawBox(542,17,640,43); /* Box around read/write boot gags */
-
- DrawBox(541,43,639,72); /* Box around read/write file gadgets */
- DrawBox(542,43,640,72); /* Box around read/write file gadgets */
-
- SetColor(3,0);
- Locate(1,2); Print("Name : ");
- Locate(2,2); Print("Comment : ");
- Locate(3,2); Print("Error : ");
- SetColor(1,0);
- Locate(1,12); Print(&kindofbb[0]);
-
- Move(FirstWindow->RPort,548,25); Print(" Bootblock");
- Move(FirstWindow->RPort,548,55); Print(" File ");
- if(isthereabb) PrintCurrentBB();
- else {
- CLD();
- Locate(5,2); Print("BootBase v2.3 - by Steven Lagerweij");
- Locate(6,2); Print("Click with left button to perform the function");
- Locate(7,2); Print("Click with right button to see help about a function");
- Locate(8,2); Print("Press HELP to see the keys");
- }
- return(0);
- }
-
- FindUnit(devname)
- char devname[50];
- {
- struct DeviceList *zoekdev;
- char isithim[50];
- zoekdev = (struct DeviceList *) BADDR(((struct DosInfo *)
- BADDR(((struct RootNode *) (DOSBase->dl_Root))->rn_Info))->di_DevInfo);
-
- while(zoekdev != 0)
- {
- sprintf(&isithim[0],"%s:",BADDR(zoekdev->dl_Name)+1);
- if((zoekdev->dl_Type == DLT_DEVICE) &&
- (stcpma(&devname[0],&isithim[0])))
- return(TRUE);
- zoekdev = (struct DeviceList *)BADDR(zoekdev->dl_Next);
- }
- return(FALSE);
- }
-
-
- GadgetActs()
- {
-
- switch(GadgetID)
- {
- /* Read BB */ case 1 : ErrPrint(ShowBootBlock()); break;
-
- /* Write BB */ case 2 : if(AreYouSure(0,3,3)) WriteBootBlock(); break;
-
- /*Read from file*/ case 3 : ReadFile(); break;
- /*Write to file*/ case 4 : WriteToFile(); break;
- /*Toggle compare*/ case 5 : if(AutoCompare) AutoCompare = FALSE;
- else AutoCompare = TRUE;
- break;
- /*Toggle diskins*/ case 6 : if(AutoRead) AutoRead = FALSE;
- /*Auto read disk*/ else AutoRead = TRUE;
- break;
- /* Quit */ case 7 : if(AreYouSure(3,1,3)) Close_All(); break;
- /* Noboot bb */ case 8 : MakeNobootbuf(); Grafiek(1); break;
- /* Standard bb*/ case 9 : MakeStanbuf(); Grafiek(1); break;
- /*Toggle comments*/case 10: if(comflag) comflag = FALSE;
- else comflag = TRUE;
- break;
- /*DF0*/ case 14:
- /*DF1*/ case 13:
- /*DF2*/ case 12:
- /*DF3*/ case 11: DriveSelect(); break;
- }
- return(0);
- }
-
-
- DriveSelect()
- {
- long td;
-
-
- td = (GadgetID - 14) * -1;
- if((td < 0) || (!availdrives[td])) return(0);
- if(td == drive) return(0);
-
- drive = td; seldr[3] = '0'+drive;
-
- df0gag.GadgetText = &DF0Text; df1gag.GadgetText = &DF1Text;
- df2gag.GadgetText = &DF2Text; df3gag.GadgetText = &DF3Text;
- df0gag.GadgetRender = (APTR)&OffBorder;
- df1gag.GadgetRender = (APTR)&OffBorder;
- df2gag.GadgetRender = (APTR)&OffBorder;
- df3gag.GadgetRender = (APTR)&OffBorder;
-
- switch(drive)
- {
- case 0: df0gag.GadgetText = &DriveText;
- df0gag.GadgetRender = (APTR)&OnBorder; break;
-
- case 1: df1gag.GadgetText = &DriveText;
- df1gag.GadgetRender = (APTR)&OnBorder; break;
-
- case 2: df2gag.GadgetText = &DriveText;
- df2gag.GadgetRender = (APTR)&OnBorder; break;
-
- case 3: df3gag.GadgetText = &DriveText;
- df3gag.GadgetRender = (APTR)&OnBorder; break;
- }
- SetColor(0,0); RectFill(FirstWindow->RPort,543,75,639,96);
- RefreshGadgets(&StringGadget,FirstWindow,NULL);
- return(0);
- }
-
-
-
- DrawBox(x1,y1,x2,y2)
- short x1,y1,x2,y2;
- {
- Move(FirstWindow->RPort,x1,y1);
- Draw(FirstWindow->RPort,x2,y1);
- Draw(FirstWindow->RPort,x2,y2);
- Draw(FirstWindow->RPort,x1,y2);
- Draw(FirstWindow->RPort,x1,y1);
- return(0);
- }
-
- WriteToFile()
- {
- long ret;
-
- file[0] = '\0';
-
- if(!isthereabb)
- { ErrPrint("No bootblock available!"); return(FALSE); };
-
- ret = arpreq("Write bootblock to file", file, writedir, FirstWindow);
- if((ret != 0) && (file[0] != '\0'))
- {
- Koppel(&writedir[0],&file[0]);
- if((Writeptr = (char *)Open(&Attached[0],WRITE)) == 0L) goto quit;
- else {
- Write(Writeptr,diskbuffer,BUFFER);
- Close(Writeptr);
- if(comflag) SetComment(&Attached[0],&StringBuffer[0]);
- ErrPrint("written to file ok.");
-
- }
- }
- quit:
- return(ret);
- }
-
- Koppel(dirname,filename)
- char dirname[64],filename[64];
- {
- if(dirname[0] == '\0')
- { sprintf(&Attached[0],"%s",&filename[0]); return(0); };
-
- if((dirname[strlen(&dirname[0])-1] != ':') &&
- (dirname[strlen(&dirname[0])-1] != '/'))
- sprintf(&Attached[0],"%s/%s",&dirname[0],&filename[0]);
- else /* ^ !!!! */
- sprintf(&Attached[0],"%s%s",&dirname[0],&filename[0]);
-
- return(0);
- }
-
- CompWithFile()
- {
- long ret,routret = FALSE,cntm = 0,largm = 0,larcnt = 0;
- short loop;
-
- if(!isthereabb) { ErrPrint("No bootblock available!"); return(0); }
- file[0] = '\0';
-
- sprintf(&kindofbb[0]," ");
- ret = arpreq("Select file to compare with bootblock", file, readdir, FirstWindow);
-
- if((ret != 0) && (file[0] != '\0'))
- {
- Koppel(&readdir[0],&file[0]);
- if((Readptr = (char *)Open(&Attached[0],READ)) == 0L) goto quit;
- else {
- if((Read(Readptr,Map,BUFFER)) != BUFFER)
- { Close(Readptr); routret = TOSHORT; goto quit; };
- Close(Readptr);
- }
- routret = MATCH;
- for(loop=0;loop<BUFFER;loop++)
- {
- if(diskbuffer[loop] != Map[loop])
- {
- routret = NOMATCH;
- if(larcnt > largm) largm = larcnt;
- larcnt = 0;
- }
- else { cntm++; larcnt++; }
- }
- }
- else { routret = CANCELED; goto quit; };
- quit:
- sprintf(&tmp[0],"Bytes matched: %-6ld, largest block %ld",cntm,largm);
- if(routret == MATCH) sprintf(&kindofbb[0],"%-25s",&file[0]);
- ErrPrint(&tmp[0]);
- Grafiek(0);
- return(routret);
- }
-
- ReadFile()
- {
- long ret,routret = FALSE;
- short loop;
-
- file[0] = '\0';
-
- ret = arpreq("Select file to read as bootblock", file, readdir, FirstWindow);
- if((ret != 0) && (file[0] != '\0'))
- {
- Koppel(&readdir[0],&file[0]);
- if((Readptr = (char *)Open(&Attached[0],READ)) == 0L) {
- sprintf(&tmp[0],"Couldn't open '%s'",&Attached[0]);
- ErrPrint(&Attached[0]);
- goto quit;
- }
- ret = Read(Readptr,Map,BUFFER);
- Close(Readptr);
- if((ret == -1) || (ret != BUFFER)) goto quit;
- GetComment(&Attached[0]);
- routret = TRUE;
- for(loop=0;loop<BUFFER;loop++)
- diskbuffer[loop] = Map[loop];
- isthereabb = TRUE;
- sprintf(&kindofbb[0],"From file: %s ",&file[0]);
- Grafiek(0);
- SetColor(1,0);
- PrintCurrentBB();
- LayOut();
- }
- else { routret = CANCELED; goto quit; };
- quit:
- if(!routret) ErrPrint("Error reading file!");
- return(routret);
- }
-
-
-
- Help(x,y)
- short x,y;
- {
- CLD();
- SetColor(1,0);
-
- if((x > 545) && (x < 590) &&
- (y > 30) && (y < 41))
- {
- Locate( 5,2); Print("Click on this gadget if you want to read");
- Locate( 6,2); Print("a bootblock from the selected drive");
- Locate( 7,2); Print("See Auto Comp.");
- Locate( 8,2); Print("If the program fails to read a");
- Locate( 9,2); Print("bootblock the previous bootblock is printed");
- Locate(10,2); Print("in the third color of your WB Colors");
- }
-
- else if((x > 595) && (x < 635) &&
- (y > 30) && (y < 41)) /* WRITE BOOT */
- {
- Locate(5,2); Print("Click on this gadget if you want to write");
- Locate(6,2); Print("current bootblock to the selected drive");
- }
-
- else if((x > 595) && (x < 635) &&
- (y > 60) && (y < 71)) /* WRITE FILE */
- {
- Locate(5,2); Print("If you select this gadget you'll be asked");
- Locate(6,2); Print("for a filename. Then this program will");
- Locate(7,2); Print("write the current bootblock to that file");
- }
- else if((x > 545) && (x < 690) &&
- (y > 60) && (y < 71)) /* READ FILE */
- {
- Locate(5,2); Print("This function reads a file as a bootblock");
- Locate(6,2); Print("So you can write it to disk");
- }
-
- else if((x > 10) && (x < 530) &&
- (y > 45) && (y < 180)) /* bootblock */
- {
- Locate(5,2); Print("This box will be used for the display");
- Locate(6,2); Print("of results from several functions.");
- Locate(7,2); Print("READ BOOT fe. uses it to display the ASCII");
- Locate(8,2); Print("dump of the bootblock");
- }
- else if((x > 10) && (x < 530) &&
- (y > 15) && (y < 45)) /* Box around error messages */
- {
- Locate( 5,2); Print("That box is used to display the name and");
- Locate( 6,2); Print("comment of a file that you've red with");
- Locate( 7,2); Print("read-file or the name of the file that matches");
- Locate( 8,2); Print("the current bootblock");
- Locate(09,2); Print("Errors are printed here and the comment can be");
- Locate(10,2); Print("changed (Saved only if Comment is ON)");
- }
- else if((x > 545) && (x < 640) &&
- (y > 146) && (y < 157))
- {
- Locate( 5,2); Print("This gadget is a gadget, that toggles");
- Locate( 6,2); Print("Auto Compare. If this gadget is toggled");
- Locate( 7,2); Print("to ON and you select READ BOOT,");
- Locate( 8,2); Print("this program will automaticly search ");
- Locate( 9,2); Print("and compare any file which is found");
- Locate(10,2); Print("in a directory called BBS:. with the current");
- Locate(11,2); Print("bootblock. If a file totally (1024 bytes) matches");
- Locate(12,2); Print("his name will appear.");
- Locate(13,2); Print("If not 'Not Identified !' will be printed on that place");
- Locate(15,2); Print("The search and compare sequence can be aborted");
- Locate(16,2); Print("at any time by pressing and holding");
- Locate(17,2); Print("the Left button until he aborted");
- }
- else if((x > 0) && (x < 640) &&
- (y > 185) && (y < 250) && (PAL)) /* grafieken */
- {
- Locate( 5,2); Print("That area is used for two graphics which");
- Locate( 6,2); Print("represent 1024 bytes. The lower one is always");
- Locate( 7,2); Print("in the second color of your WB Colors, and");
- Locate( 8,2); Print("it represents the current bootblock");
- Locate( 9,2); Print("The upper represents the current file");
- Locate(10,2); Print("and will be printed in the the same color as");
- Locate(11,2); Print("the bootblock if that byte matches the byte");
- Locate(12,2); Print("from the bootblock. if not the color is the");
- Locate(13,2); Print("third color of your WB Colors (Cursor in CLI)");
- Locate(14,2); Print("This can be turned off by pressing F10");
- }
- else if((x > 535) && (x < 640) &&
- (y > 134) && (y < 145))
- {
- Locate( 5,2); Print("When you activate the auto read option");
- Locate( 6,2); Print("the program reads any bb from any disk");
- Locate( 7,2); Print("that is inserted");
- }
- else if((x > 535) && (x < 640) && (y > 111) && (y < 121))
- {
- Locate( 5,2); Print("Pressing this gadget gives you a do nothing");
- Locate( 6,2); Print("bootblock, which can be written to disk");
- }
- else if((x > 535) && (x < 640) && (y > 99) && (y < 109))
- {
- Locate( 5,2); Print("Pressing this gadget gives you a standard");
- Locate( 6,2); Print("bootblock, which can be written to disk");
- }
- else if((x > 535) && (x < 640) && (y > 122) && (y < 132))
- {
- Locate( 5,2); Print("If this gadget is activated the program");
- Locate( 6,2); Print("writes the contents of the comment");
- Locate( 7,2); Print("(string) gadget to the file if you");
- Locate( 8,2); Print("select write to file");
- }
- else if((x > 535) && (x < 640) && (y > 159) && (y < 169))
- {
- Locate( 5,2); Print("There is only one thing special about quit");
- Locate( 6,2); Print("Since the screen of BootBase is a");
- Locate( 7,2); Print("WBENCHSCREEN other programs that normally");
- Locate( 8,2); Print("open their window on the WBench could open");
- Locate( 9,2); Print("up on this screen, so when you quit");
- Locate(10,2); Print("You'll be asked to remove those windows first");
- Locate(11,2); Print("You don't have to do this but if you can");
- Locate(12,2); Print("it is better to do so");
- Locate(14,2); Print("Try this and you understand what I mean ");
- Locate(15,2); Print("Make sure this screen is the most front screen");
- Locate(16,2); Print("pull this screen down so you can click on a");
- Locate(17,2); Print("WBench drawer Icon, you'll see that the drawer");
- Locate(18,2); Print("window opens on BootBase' screen");
- }
- else LayOut();
- return(0);
- }
-
- Grafiek(which)
- short which;
- {
-
- short ybase;
- short x,p;
- short addy;
-
- if((!VisualComp) || (!PAL)) return(0);
-
- if(which == 9) goto Graph2;
- ybase = 235; p = 0; x = 10; addy = 0;
- SetColor(0,0); RectFill(FirstWindow->RPort,0,217,640,250);
- if(which > 1) goto Graph2;
-
- Move(FirstWindow->RPort,0,ybase);
- SetColor(2,0);
- while(x < 522)
- {
- addy = diskbuffer[p]/10;
- Draw(FirstWindow->RPort,x,ybase+addy);
- addy = diskbuffer[p+1]/10;
- Draw(FirstWindow->RPort,x,ybase+addy);
- x++; p+=2;
- }
-
- Graph2:
- SetColor(0,0); RectFill(FirstWindow->RPort,0,185,640,217);
- ybase = 200; x = 10; p = 0; addy = 0;
- if(which == 1) goto quit;
- Move(FirstWindow->RPort,0,ybase);
- while(x < 522)
- {
- if((diskbuffer[p] == Map[p]) || (diskbuffer[p+1] == Map[p+1]))
- SetColor(2,0);
- else SetColor(3,0);
- addy = Map[p]/10;
- Draw(FirstWindow->RPort,x,ybase+addy);
- addy = Map[p+1]/10;
- Draw(FirstWindow->RPort,x,ybase+addy);
- x++; p+=2;
- }
- quit:
- return(0);
- }
-
-
-
- DoComparing()
- {
- struct Lock *disklock;
- struct FileInfoBlock *fib;
- short flag;
- short loop;
-
- fib = 0;
- disklock = 0;
-
- if((fib = (struct FileInfoBlock *)
- AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR)) == 0) goto quit;
-
- if((disklock = (struct Lock *)
- Lock(&CompPath[0],SHARED_LOCK)) == 0) goto quit;
-
- if(!Examine(disklock,fib)) goto quit;
- if(fib->fib_DirEntryType < 0) goto quit;
-
- Grafiek(1);
- while(ExNext(disklock, fib))
- {
- if(fib->fib_DirEntryType > 0) goto next;
- Koppel(&CompPath[0],fib->fib_FileName);
- if((Readptr = (char *)Open(&Attached[0],READ)) == 0L) goto quit;
- else if((Read(Readptr,Map,BUFFER)) != BUFFER)
- { Close(Readptr); goto next; };
- Close(Readptr);
- sprintf(&tmp[0],"Comparing with %s",fib->fib_FileName);
- ErrPrint(&tmp[0]);
- flag = TRUE;
- for(loop=0;loop<BUFFER;loop++)
- if(diskbuffer[loop] != Map[loop])
- { flag = FALSE; break; };
- Grafiek(9);
- if(flag)
- {
- sprintf(&kindofbb[0],"%-25s",fib->fib_FileName);
- goto quit;
- }
- if(((*LeftMouse & 0x40) != 0x40) &&
- (IntuitionBase->ActiveWindow == FirstWindow)) goto quit;
- next:
- }
- sprintf(&kindofbb[0],"Not identified ! ");
- quit:
- if(flag) GetComment(&Attached[0]);
- if (disklock) UnLock(disklock);
- if(fib) FreeMem(fib,sizeof(fib));
- LayOut();
- return(0);
- }
-
-
- WriteBootBlock()
- {
- short writeerr;
- char oneline[100];
-
- if(!isthereabb)
- { ErrPrint("No bootblock available!"); return(FALSE); };
- if((diskport = CreatePort(0,0)) == 0)
- { ErrPrint(NOPORT); return(FALSE); };
-
- if((diskreq = (struct IOExtTD *)
- CreateExtIO(diskport,sizeof(struct IOExtTD))) == NULL)
- { DeletePort(diskport); ErrPrint(NOEXT); return(FALSE); }
-
- if(OpenDevice(TD_NAME,drive,diskreq,0))
- {
- DeleteExtIO(diskreq,sizeof(struct IOExtID));
- DeletePort(diskport);
- ErrPrint(NODISK);
- }
-
- diskreq->iotd_Req.io_Command = TD_CHANGESTATE;
- DoIO(diskreq);
- if(diskreq->iotd_Req.io_Actual != 0)
- {
- CloseDevice(diskreq);
- DeleteExtIO(diskreq,sizeof(struct IOExtTD));
- DeletePort(diskport);
- ErrPrint(NODISK);
- return(FALSE);
- }
- diskreq->iotd_Req.io_Command = TD_PROTSTATUS;
- DoIO(diskreq);
- if(diskreq->iotd_Req.io_Actual != 0)
- {
- CloseDevice(diskreq);
- DeleteExtIO(diskreq,sizeof(struct IOExtTD));
- DeletePort(diskport);
- ErrPrint(PROTECT);
- return(FALSE);
- }
-
- diskreq->iotd_Req.io_Command = TD_CHANGENUM;
- DoIO(diskreq);
- diskchangecount = diskreq->iotd_Req.io_Actual;
-
- MotorOn();
- writeerr = WriteCylSec(0,0,0);
- MotorOff();
- if(writeerr > 19)
- {
- CLD();
- sprintf(&oneline[0],"Write Error: %-7d",writeerr);
- Print(&oneline[0]);
- SetColor(3,0);
- if(isthereabb) PrintCurrentBB();
- }
- else
- {
- CLD();
- ErrPrint("Written to disk Ok. ");
- SetColor(1,0);
- PrintCurrentBB();
- Grafiek(1);
- StringBuffer[0] = '\0'; UndoBuffer[0] = '\0';
- RefreshGadgets(&StringGadget,FirstWindow,NULL);
- }
- CloseDevice(diskreq);
- DeleteExtIO(diskreq,sizeof(struct IOExtTD));
- DeletePort(diskport);
- return(NOPROB);
- }
-
- WriteCylSec(cyl,sec,hd)
- SHORT cyl,sec,hd;
- {
- LONG offset;
-
- diskreq->iotd_Req.io_Length = BUFFER;
- diskreq->iotd_Req.io_Data = (APTR)diskbuffer;
- diskreq->iotd_Req.io_Command = ETD_WRITE;
- diskreq->iotd_Count = diskchangecount;
- offset = TD_SECTOR * (sec + NUMSECS * hd + NUMSECS * NUMHEADS * cyl);
- diskreq->iotd_Req.io_Offset = offset;
- DoIO(diskreq);
- diskreq->iotd_Req.io_Command = CMD_UPDATE;
- DoIO(diskreq);
- return(diskreq->iotd_Req.io_Error);
- }
-
-
- MakeNobootbuf()
- {
- short loop;
-
- for(loop=0;loop<1024;loop += 4)
- {
- diskbuffer[loop] = 'D';
- diskbuffer[loop+1] = 'O';
- diskbuffer[loop+2] = 'S';
- diskbuffer[loop+3] = 0x00;
- }
- sprintf(&kindofbb[0],"Do nothing bootblock ");
- isthereabb = TRUE;
- LayOut();
- return(0);
- }
-
- MakeStanbuf()
- {
- short loop;
-
- sprintf(&kindofbb[0],"Standard 1.2/1.3 ");
- for(loop=0;loop<1024;loop++)
- {
- if(loop < 49) diskbuffer[loop] = standard[loop];
- else diskbuffer[loop] = 0x00;
- }
- isthereabb = TRUE;
- LayOut();
- return(0);
- }
-
-
- CheckIfStandard()
- {
- short loop,chk = TRUE;
-
- for(loop=0;loop<1024;loop++)
- {
- if((loop < 49) && (diskbuffer[loop] != standard[loop])) chk = FALSE;
- else if((loop >= 49) && (diskbuffer[loop] != 0x00)) chk = FALSE;
- }
- if(chk == TRUE) return(1);
-
- chk = TRUE;
- for(loop=0;loop<1024;loop += 4)
- {
- if((diskbuffer[loop] != 'D') ||
- (diskbuffer[loop+1] != 'O') ||
- (diskbuffer[loop+2] != 'S')) { chk = FALSE; break; };
- /* There is no test for diskbuffer[loop+3] because I've seen
- a lot of different versions and it doesn't really matter
- what's at this location, it can't be a virus or an executable */
-
- }
- if(chk == TRUE) return(2);
- return(0);
- }
-
- AreYouSure(txtno,txtlen,col)
- short txtno,txtlen,col;
- {
- short x,y,start;
- long ret = FALSE;
- long ledge,tedge,maxy = 256;
- if(!PAL) maxy = 200;
- ledge = FirstWindow->MouseX-265;
- tedge = FirstWindow->MouseY-50;
- if(ledge < 0) ledge = 0;
- if(ledge > 335) ledge = 335;
- if(tedge < 0) tedge = 0;
- if(tedge > maxy-100) tedge = maxy-100;
- ReqWindow.LeftEdge = ledge;
- ReqWindow.TopEdge = tedge;
- if(!(reqwin = (struct Window *)OpenWindow(&ReqWindow))) return(FALSE);
-
- if(txtlen > 6) txtlen = 6;
- SetColor(col,0);
- x = 10;
- start = 20+(((6-txtlen)/2)*8);
- for(y=txtno;y<(txtno+txtlen);y++)
- {
- Move(reqwin->RPort,x,start+((y-txtno)*8));
- Text(reqwin->RPort,ReqTexts[y],strlen(ReqTexts[y]));
- }
-
- for(;;)
- {
- if ((message = (struct IntuiMessage *)
- GetMsg(reqwin->UserPort)) == NULL)
- {
- Wait(1<<reqwin->UserPort->mp_SigBit);
- continue;
- }
- MessageClass = message->Class;
- code = message->Code;
- GadgetPtr = (struct Gadget *) message->IAddress;
- GadgetID = GadgetPtr->GadgetID;
- ReplyMsg(message);
-
-
- switch (MessageClass)
- {
- case GADGETUP :
- if(GadgetID == 1) { ret = (TRUE); goto quit; }
- else if(GadgetID == 2) { ret = FALSE; goto quit; }
- break;
-
- }
- }
- quit:
- if(reqwin) CloseWindow(reqwin);
- return(ret);
- }
-
-
-
- DiskIns()
- {
- short lus,cd = FALSE;
-
- if((diskport = CreatePort(0,0)) == 0) return(NOPORT);
- if((diskreq = (struct IOExtTD *)
- CreateExtIO(diskport,sizeof(struct IOExtTD))) == NULL)
- { DeletePort(diskport); return(NOEXT);};
-
- for(lus = 0;lus < 4;lus++)
- {
- if(!availdrives[lus]) continue;
- OpenDevice(TD_NAME,lus,diskreq,0);
-
- diskreq->iotd_Req.io_Command = TD_CHANGESTATE;
- DoIO(diskreq);
-
- if(diskreq->iotd_Req.io_Actual != 0)
- { CloseDevice(diskreq); continue; }
-
- diskreq->iotd_Req.io_Command = TD_CHANGENUM;
- DoIO(diskreq);
- diskchangecount = diskreq->iotd_Req.io_Actual;
- CloseDevice(diskreq);
- if(!setupcnt)
- {
- if(remcount[lus] != diskchangecount)
- {
- if(AutoRead)
- { GadgetID = 14 - lus; DriveSelect(); };
- cd = TRUE;
- remcount[lus] = diskchangecount;
- goto quit;
- }
- }
- else remcount[lus] = diskchangecount;
- }
- quit:
- DeleteExtIO(diskreq,sizeof(struct IOExtTD));
- DeletePort(diskport);
- if(cd) return(0);
- return(TRUE);
- }
-
-
- GetComment(whichfile)
- char whichfile[200];
- {
- struct Lock *disklock;
- struct FileInfoBlock *fib;
-
- short ret = 0;
- fib = 0;
- disklock = 0;
-
- if((fib = (struct FileInfoBlock *)
- AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR)) == 0) goto quit;
-
- if((disklock = (struct Lock *)
- Lock(&whichfile[0],SHARED_LOCK)) == 0) goto quit;
-
- if(!Examine(disklock,fib)) goto quit;
- sprintf(&StringBuffer[0],"%s",fib->fib_Comment);
- RefreshGadgets(&StringGadget,FirstWindow,NULL);
- ret = 1;
-
- quit:
- if (disklock) UnLock(disklock);
- if(fib) FreeMem(fib,sizeof(fib));
- return(ret);
- }
-
- PrintKeys()
- {
- CLD();
-
- Locate(5,10); Print("Available keys (RAWKEY)");
- Locate(6,2); Print("F1 = Compare with file; Sorry no gadget!");
- Locate(7,2); Print("F9 = Redraw");
- Locate(8,2);
- if(PAL) { Print("F10 = toggle graphics"); Locate(9,2); }
- Print("ESC = Quit");
- return(0);
- }
-
- Do_RawKey(key) /* Perform actions on certain keys */
- USHORT key;
- {
- switch(key)
- {
- case F1 : CompWithFile();
- break;
- case F9 : RefreshGadgets(&ReadBB,FirstWindow,NULL);
- LayOut(); Grafiek(0); break;
- case F10 :
- if(PAL)
- {
- if(VisualComp) {
- VisualComp = FALSE;
- SetColor(0,0);
- RectFill(FirstWindow->RPort,0,180,640,250);
- SetColor(1,0);
- }
- else { VisualComp = TRUE; Grafiek(0); }
- }
- break;
- case ESC : if(AreYouSure(3,1,3)) Close_All(); break;
- case HELP : PrintKeys();
- break;
- }
- return(0);
- }
-
-
-