home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Games / JST / sources / src / loaders / GreatCourts / gc2file.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-03-19  |  3.4 KB  |  185 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4.  
  5. #include <dos/dos.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8. #include <exec/execbase.h>
  9. #include <exec/libraries.h>
  10. #include <exec/memory.h>
  11. #include <pragmas/dos_pragmas.h>
  12. #include <string.h>
  13.  
  14. #define RAWTRACK_LEN 0x8000
  15. #define TRACK_LEN 0x1790
  16. #define TRACK_LEN_ALLOC 0x1800
  17.  
  18. extern struct ExecBase *SysBase;
  19.  
  20. extern APTR InitTrackDisk(ULONG);
  21. extern void ShutTrackDisk(void);
  22. extern ULONG CheckDiskIn (void);
  23.  
  24. extern ULONG ReadRawTrackIndex(ULONG,UBYTE *);
  25. extern ULONG DecodeTrack(UBYTE *, UBYTE *);
  26. UBYTE *rawTrackBuffer=0L;
  27. UBYTE *decTrackBuffer=0L;
  28. char *charunit="DF0:";
  29. int allocated=0,diskinit=0;
  30. FILE *f;
  31.  
  32. void CloseAll(char *mess)
  33.  
  34. {
  35. if (f) fclose(f);
  36.  
  37. if (mess) printf("** %s\n",mess);
  38.  
  39. if (diskinit) ShutTrackDisk();
  40. if (allocated) Inhibit(charunit,FALSE);
  41. if (rawTrackBuffer) FreeMem((APTR)rawTrackBuffer,RAWTRACK_LEN);
  42. if (decTrackBuffer) FreeMem((APTR)decTrackBuffer,TRACK_LEN_ALLOC);
  43.  
  44.  
  45. exit(0);
  46. }
  47.  
  48. void BreakHandle(int code)
  49.  
  50. {
  51. CloseAll("User break");
  52. }
  53.  
  54.  
  55. int findArg(unsigned int argc,char ** argv,char * argstr)
  56. {
  57.   int argl,i;
  58.  
  59.   argl=strlen(argstr);
  60.  
  61.   for (i=0;i<argc;i++)
  62.     if (!strncmp(argv[i],argstr,argl)) return i;
  63.  
  64.   return 0;
  65. }
  66.  
  67.  
  68. main(unsigned int argc,char ** argv)
  69.  
  70.  
  71. {
  72.   ULONG diskunit=0; /* default values */
  73.   int i,retries,readok,dcrslt,end=0;
  74.   char filename[108]="";
  75.  
  76.   signal(SIGINT,BreakHandle); /* CTRL-C caught */
  77.  
  78.   printf("\2331;37;40mGreat Courts disk imager\2330;31;40m - by JF Fabre\n");
  79.  
  80.   switch(argc)
  81.  
  82.      {
  83.  
  84.     case 3:
  85.         strcpy(filename,argv[2]);
  86.         diskunit=(ULONG)argv[1][0]-'0';
  87.         break;
  88.         
  89.     default:
  90.         printf("\nUsage : %s <unit> <filename>\n",argv[0]);
  91.         if (!argc) Delay(200);
  92.         CloseAll(0);
  93.     }
  94.  
  95.  
  96.   diskunit=(ULONG)argv[1][0]-'0';
  97.  
  98.   if ((diskunit>3)||(diskunit<0)) {printf("** Unit %d unavailable\n",diskunit);CloseAll(0);}
  99.  
  100.   charunit[2]=diskunit+'0';
  101.  
  102.   if (SysBase->LibNode.lib_Version>36)
  103.     {
  104.     if(Inhibit(charunit,DOSTRUE)==FALSE) CloseAll("Can't allocate device !");
  105.     allocated=1;
  106.     }
  107.  
  108.   if ((ULONG)InitTrackDisk(diskunit)<0) {printf("** Can't open unit %d !",diskunit);CloseAll(0);}
  109.   diskinit=1;
  110.   if (CheckDiskIn()) {printf("** No disk in unit %d !\n",diskunit);CloseAll(NULL);}
  111.  
  112.   decTrackBuffer=(char *)AllocMem(TRACK_LEN_ALLOC,MEMF_CLEAR);
  113.   if (decTrackBuffer==0L) CloseAll("Can't allocate memory.");
  114.  
  115.   rawTrackBuffer=(char *)AllocMem(RAWTRACK_LEN,MEMF_CHIP|MEMF_CLEAR);
  116.   if (rawTrackBuffer==0L) CloseAll("Can't allocate chip memory.");
  117.  
  118.   f=fopen(filename,"wb");
  119.  
  120.   if (f==NULL) CloseAll("Can't create destination file!");
  121.  
  122.   i=3;
  123.   printf("Reading side 1...\n");
  124.   while (!end)
  125.     {
  126.       if (i==145)
  127.       {
  128.         i=2;
  129.         printf("Reading side 2...\n");
  130.       }
  131.       else
  132.       {
  133.         if (i==158)
  134.         {
  135.            end=1;
  136.         }
  137.       }
  138.  
  139.  
  140.     retries=0;
  141.     readok=0;
  142.  
  143.     do
  144.     {
  145.         if (ReadRawTrackIndex(i,rawTrackBuffer))
  146.             {
  147.             if (retries>2) CloseAll("Low level disk read error!");
  148.             }
  149.         else
  150.         
  151.             {    
  152.  
  153.          dcrslt=DecodeTrack(rawTrackBuffer,decTrackBuffer);
  154.  
  155.             if (!dcrslt)
  156.                     {
  157.                         readok=1;
  158.                         if (fwrite(decTrackBuffer,1,TRACK_LEN,f)!=TRACK_LEN) CloseAll("Disk full !");
  159.                     }
  160.  
  161.             else
  162.                     {
  163.                         if (retries>2)
  164.  
  165.                             switch(dcrslt)
  166.                             {    
  167.                             case 2: printf("** Error Track %d\n",i);CloseAll("No sync found!");
  168.                             default: printf("** Error Track %d\n",i);CloseAll("Decode disk read error!");
  169.                             }
  170.                     }
  171.  
  172.             }
  173.  
  174.     retries++;
  175.     }
  176.     while (!readok);
  177.     i+=2;
  178.     }
  179.  
  180.     printf("Disk image done\n");
  181.  
  182.     CloseAll(0);
  183. }
  184.  
  185.