    1  /***********************************************************\
    2  * BloCom vergleicht eine Folge von Blöcken zweier Disketten *
    3  * Getestet mit Aztec C V3.6a                                *
    4  * Programmiert 1989 von: Angela Schmidt, Neu-Ulm            *
    5  * Compileraufruf: cc BloCom                                 *
    6  *                 ln BloCom -lc                             *
    7  \***********************************************************/
    8  
    9  #include <exec/exec.h>
   10  #include <devices/trackdisk.h>
   11  #include <functions.h>
   12  #include <stdio.h>
   13  
   14  struct MsgPort  *diskport[2];
   15  struct IOStdReq *diskreq[2];
   16  int openerror[2];
   17  unsigned char   *Buf[2];
   18  
   19  
   20  ReadBlock (block, buffer, Unit)  /* Liest Block 'block' aus Drive 'Unit' in */
   21  int Unit, block;                 /* Speicherbereich 'buffer'                */
   22  unsigned char *buffer;
   23  {
   24     diskreq[Unit]->io_Length  = TD_SECTOR;
   25     diskreq[Unit]->io_Data    = (APTR)buffer;
   26     diskreq[Unit]->io_Command = CMD_READ;
   27     diskreq[Unit]->io_Offset  = block*TD_SECTOR;
   28     DoIO (diskreq[Unit]);
   29  }
   30  
   31  Motor (Zustand, Unit)      /* Motor des Drives 'Unit' schalten          */
   32  long Zustand;              /* Zustand = TRUE: AN - Zustand = FALSE: AUS */
   33  int Unit;
   34  {
   35     diskreq[Unit]->io_Length  = Zustand;
   36     diskreq[Unit]->io_Command = TD_MOTOR;
   37     DoIO (diskreq[Unit]);
   38  }
   39  
   40  Errorcheck (FNr, drive, blk)
   41  int FNr, drive, blk;
   42  {
   43     printf ("\nHoppla, ein Fehler beim Leseversuch DRIVE %d - BLOCK %d\n\n",drive,blk);
   44     switch (FNr)
   45     {
   46        case 21: puts ("Sorry, kein Sektor-Header");break;
   47        case 23: puts ("Falsche Sektor-Kennung");break;
   48        case 24: puts ("Header-Checksumme stimmt nicht!");break;
   49        case 25: puts ("Falsche Daten-Checksumme");break;
   50        case 26: puts ("Das sind aber keine 11 Sektoren pro Track!");break;
   51        case 27: puts ("Sektor-Header unlesbar");break;
   52        case 29: puts ("Eine Diskette brauche ich aber schon!!!");break;
   53        case 31: puts ("Wie wärs mit einer Speichererweiterung?");break;
   54        case 33: puts ("Was ist das für ein komisches Laufwerk???");break;
   55        case 34: puts ("Welcher unverschämte Task klaut mir da mein Laufwerk?");break;
   56        default: printf ("Fehlernummer: %d\n",FNr);
   57     }
   58  }
   59  
   60  cleanall (text)
   61  char *text;
   62  {
   63     if (!openerror[0]) Motor (FALSE,0);
   64     if (!openerror[1]) Motor (FALSE,1);
   65     cleanup (0);
   66     cleanup (1);
   67     if (text) puts(text);
   68     exit(0);
   69  }
   70  
   71  cleanup (Unit)              /* Aufräumen und Message ausgeben */
   72  int Unit;
   73  {
   74     if (!openerror[Unit]) CloseDevice (diskreq[Unit]);
   75     if (diskreq[Unit])    DeleteStdIO (diskreq[Unit]);
   76     if (diskport[Unit])   DeletePort (diskport[Unit]);
   77     if (Buf[Unit])        FreeMem (Buf[Unit], TD_SECTOR);
   78  }
   79  
   80  
   81  main ()
   82  {
   83     char eingabe[1];
   84     int opt, Unit;
   85     int StartBlock, EndBlock;
   86     register int blk, i;
   87     char *help;
   88  
   89     printf ("%cc%c[1;4;33mBloCom%c[0m  (%c[33mBlo%c[31mck-%c[33mCom%c[31mparer%c[0m)\n\n",27,27,27,27,27,27,27,27);
   90     puts ("Programmiert 1989 von Angela Schmidt\n");
   91     puts ("Dieses Programm vergleicht beliebige Blöcke zweier Disketten in den");
   92     puts ("Drives 'DF0:' und 'DF1:'. Start- und Endblock können angeben werden.");
   93     puts ("Sie können entweder jedes Byte, das verschieden ist, ausgeben lassen");
   94     puts ("oder nur die Nummern der Blöcke, die verschieden sind.\n");
   95     puts ("Während des Vergleichs kann das Programm jederzeit mit <HELP> beendet werden.\n");
   96  
   97     do {
   98        printf ("Bytes (b) - Blocknummern (n) - Ende (e)  => ");
   99        scanf ("%1s",eingabe);
  100     } while (!(eingabe[0]=='b' || eingabe[0]=='n' || eingabe[0]=='e'));
  101     if (eingabe[0]=='b') opt=TRUE; else opt=FALSE;
  102     if (eingabe[0]=='e') exit (0);
  103  
  104     do {
  105        printf ("Startblock (0-1759) => ");
  106        scanf ("%d",&StartBlock);
  107     } while (StartBlock<0 || StartBlock>1759);
  108  
  109     do {
  110        printf ("Endblock   (0-1759) => ");
  111        scanf ("%d",&EndBlock);
  112     } while (EndBlock<0 || EndBlock>1759);
  113  
  114     if (StartBlock>EndBlock) exit (0);
  115  
  116     openerror[0]=TRUE; openerror[1]=TRUE;
  117     help=12577793;
  118  
  119     for (Unit=0; Unit<=1; Unit++)
  120     {
  121        Buf[Unit] = AllocMem (TD_SECTOR,MEMF_CHIP|MEMF_CLEAR);
  122        if (!Buf[Unit]) cleanall ("Kein Speicher");
  123  
  124        diskport[Unit] = CreatePort ("Angela.port",0L);
  125        if (!diskport[Unit]) cleanall ("CreatePort hat nicht funktioniert!");
  126  
  127        diskreq[Unit] = CreateStdIO (diskport[Unit]);
  128        if (!diskreq[Unit]) cleanall ("CreateStdIO hat nicht funktioniert!");
  129  
  130        openerror[Unit] = OpenDevice (TD_NAME,(LONG)Unit,diskreq[Unit],0L);
  131        if (openerror[Unit]) cleanall ("OpenDevice hat nicht funktioniert!");
  132  
  133        Motor (TRUE,Unit);
  134     }
  135  
  136     for (blk=StartBlock; blk<=EndBlock; blk++)
  137     {
  138        if (*help==65) cleanall ("Ok, ich hör' ja schon auf.");
  139        ReadBlock (blk, Buf[0], 0);
  140        if (diskreq[0]->io_Error != 0) {
  141           Errorcheck (diskreq[0]->io_Error,0,blk);
  142           cleanall("\nIch glaube, es ist besser, wenn ich aufhöre...");
  143        }
  144        ReadBlock (blk, Buf[1], 1);
  145        if (diskreq[1]->io_Error != 0) {
  146           Errorcheck (diskreq[1]->io_Error,1,blk);
  147           cleanall("\nIch glaube, es ist besser, wenn ich aufhöre...");
  148        }
  149        for (i=0; i<512; i++)
  150        {
  151           if (Buf[0][i]!=Buf[1][i])
  152           {
  153              if (opt)
  154              {
  155                 printf ("Block %4d - Byte %3d | DF0: %2x = '%c%c' | DF1: %2x = '%c%c'\n",blk,i,Buf[0][i],Buf[0][i],15,Buf[1][i],Buf[1][i],15);
  156                 if(*help==65) cleanall ("Ach, wie schade...");
  157              }
  158              else
  159              {
  160                 i=512;
  161                 printf ("Verschieden: Block %d\n",blk);
  162              }
  163           }
  164        }
  165     }
  166     cleanall("Diskettenvergleich erfolgreich beendet!");
  167  }
  168  
