Message-ID: <880711124335.000007A3.AAQT.AA@DGIHRZ01> (UMass-Mailer 4.03)
Date:     Mon, 11 Jul 88  12:43:35 CET
From:     Garry@DGIHRZ01
          (Garry FH Fulda W.Germany)
Subject:  BBM
To:       FYS-MA@fintuvm
 
/***************************************************************************
                B         B           M
                 oot       block       maker
                   written 1988 by
                     G.Glendown
***************************************************************************/
 
/* Include Files */
 
#include        <exec/types.h>
#include        <graphics/gfxbase.h>
#include        <intuition/intuition.h>
#include        <devices/trackdisk.h>
#include        <exec/ports.h>
#include        <exec/nodes.h>
#include        <exec/io.h>
#include        <exec/devices.h>
#include        <libraries/dosextens.h>
 
#define TD_READ CMD_READ;
#define TD_WRITE        CMD_WRITE
 
struct  MsgPort         *diskport,*CreatePort();
struct  IOExtTD         *diskreq;
struct  IORequest       *CreateExtIO();
struct  FileHandle      *fh,*Open();
char                    FileName[256];
UBYTE                   Buffer[TD_SECTOR*NUMSECS],Prg[1044];
ULONG                   dcc;
ULONG                   *SB,*SP;
int                     lncnt,m,offset=36;
 
 
main    (argc,argv)
int argc;
char *argv[];
{
        if (argc<3üüargc>4) DError(argv);               /* 3 or 4 Parameters ? *
        if (argv[1][0]<'0'üüargv[1][0]>'3') DError(argv); /* Device */
        if (argc==4&&argv[3][0]=='N') offset=32;
        m=argv[1][0]-'0';                       /* change to device */
        puts(" ");
 
        SB=(ULONG *)Buffer;
        SP=(ULONG *)Prg;
 
        puts("**************************");
        puts("      B B M   V 1.1");
        puts("**************************");
        puts("  written by G. Glendown");
        puts(" ");
        puts("Writes Ass-Prg's");
        puts("in the Boot-Block");
        if (offset==32)
        puts("(Normal PRG-Struct.)\n");
        else
        puts("(Seka-Program.)\n");
        fh=Open(argv[2],MODE_OLDFILE);          /* open File */
        if (!fh) DError(argv);                  /* exists ? */
        Read(fh,Prg,1044L);                     /* read it  */
        Close(fh);                              /* close it  */
 
        ChangeBoot();                           /* change Bootsector */
}
 
ChangeBoot()
/* changes the Bootsector */
 
{
 
int                     error;
long                    g,n,u;
long                    drive;
 
        diskport = CreatePort (0L,0L);
 
        if (diskport) {
 
                diskreq = (struct IOExtTD *)
                        CreateExtIO (diskport,(LONG)sizeof (struct IOExtTD));
 
                if (diskreq) {
 
                        error = OpenDevice(TD_NAME,(long)m,diskreq,0L);
 
                        if (!error) {
 
                                diskreq->iotd_Req.io_Command = TD_CHANGENUM;
                                DoIO(diskreq);
                                dcc = diskreq->iotd_Req.io_Actual;
                                ReadBlock();
                                CopyProg();
                                WriteBlock();
                                CloseDevice (diskreq);
 
                        }
 
                        DeleteExtIO (diskreq,(long)sizeof(struct IOExtTD));
 
                }
 
                DeletePort (diskport);
 
        }
 
}
 
CopyProg()
/* Copies Program to Buffer */
 
{
 
ULONG t,g,h,s,q;
 
        SB[0]=0x444f5300;
        SB[1]=0L;
        SB[2]=0L;
        t=offset;
        g=12;
        s=0;
 
        for (h=1044;h>36;h--)                   /* copy Buffer  */
                Buffer[g++]=Prg[t++];
 
        g=0;
 
        for (h=255;h<256;h--) {                 /* calc. Checksum */
 
                q=s+SB[g++];
                if (q<s) q++;
                s=q;
 
        }
 
        q=0xffffffff-s;
        SB[1]=q;
 
}
 
ReadBlock()
 
{
 
        MotorOn();
 
        diskreq->iotd_Req.io_Length =   TD_SECTOR*NUMSECS;
        diskreq->iotd_Req.io_Data =     (APTR)Buffer;
        diskreq->iotd_Req.io_Command =  ETD_READ;
        diskreq->iotd_Count =           dcc;
        diskreq->iotd_Req.io_Offset =   0L;
 
        DoIO (diskreq);
 
        MotorOff();
 
        return();
}
 
WriteBlock()
 
{
 
        MotorOn();
 
        diskreq->iotd_Req.io_Length =   TD_SECTOR*NUMSECS;
        diskreq->iotd_Req.io_Data =     (APTR)Buffer;
        diskreq->iotd_Req.io_Command =  ETD_WRITE;
        diskreq->iotd_Count =           dcc;
        diskreq->iotd_Req.io_Offset =   0L;
 
        DoIO (diskreq);
 
        diskreq->iotd_Req.io_Length =   0L;
        diskreq->iotd_Req.io_Command =  ETD_UPDATE;
 
        DoIO (diskreq);
 
        MotorOff();
 
        return();
 
}
 
MotorOn()
 
{
 
        diskreq->iotd_Req.io_Length =   1L;
        diskreq->iotd_Req.io_Command =  TD_MOTOR;
 
        DoIO (diskreq);
 
}
 
MotorOff()
 
{
 
        diskreq->iotd_Req.io_Length =   0L;
        diskreq->iotd_Req.io_Command =  TD_MOTOR;
 
        DoIO (diskreq);
 
}
 
DError(te)
char *te[];
 
{
 
        puts("Syntax: %s <0/1/2/3> <Prg-Name> [N(ormal Prg)/S(eka) def=S]\n",te[
        exit(-111);
 
}
