home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 2 / agavol2.iso / software / utilities / emulation / amoric / tapeinfo.c < prev    next >
C/C++ Source or Header  |  1995-12-17  |  5KB  |  205 lines

  1. /***************************************************************************/
  2. /**                                                                       **/
  3. /**                Written by JF FABRE (fabre@supaero.fr)                 **/
  4. /**                                                                       **/
  5. /**                This program may be freely distibuted                  **/
  6. /**                                                                       **/
  7. /**             as long as this header is included unmodified             **/
  8. /**                                                                       **/
  9. /***************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13.  
  14. #include <dos/dos.h>
  15. #include <proto/dos.h>
  16. #include <proto/exec.h>
  17. #include <pragmas/dos_pragmas.h>
  18. #include <pragmas/exec_pragmas.h>
  19.  
  20. #include <string.h>
  21.  
  22. #define Erreur(s) {printf("** %s\n",s);CloseAll();exit(0);}
  23.  
  24. #define CloseAll() {if (fr) fclose(fr);if (fw) fclose(fw);if (buff_src) free(buff_src);}
  25.  
  26. extern struct ExecBase *SysBase;
  27. extern struct DosLibrary *DOSBase;
  28.  
  29. #define NO_SYNC -2
  30. #define ONE_SYNC -1
  31. #define THR_SYNC 0
  32.  
  33. extern ULONG GetWord680x0(UBYTE *bu);
  34.  
  35. long SeekSync(char *,long *);
  36. long SeekZero(char *,long);
  37.  
  38. /*** Chercher le zero ***/
  39.  
  40. long SeekZero(char *buff,long len)
  41.  
  42. {
  43.   long i=0;
  44.  
  45.   while ( buff[i]!='\0' )
  46.   {
  47.    i++;
  48.    if (i==len) return -1;
  49.   }
  50.  
  51. return i;
  52. }
  53.  
  54. /*** Chercher la synchro ***/
  55.  
  56. long SeekSync(char *buff,long *len)
  57.  
  58. {
  59.   int i=0;
  60.   
  61.   do
  62.   {
  63.    i++;
  64.    if (i==(*len)) return NO_SYNC;
  65.   }
  66.  
  67.   while ( (*(buff++)) !=0x16);
  68.  
  69.   switch ( *(buff++) )
  70.     {
  71.      case 0x16 : break;
  72.      case 0x24 : *len-=i+1;return ONE_SYNC;
  73.      default : return NO_SYNC;
  74.     }
  75.  
  76.   switch ( *(buff++) )
  77.     {
  78.      case 0x16 : break;
  79.      case 0x24 : *len-=i+2;return ONE_SYNC;
  80.      default : return NO_SYNC;
  81.     }
  82.  
  83.   *len-=i+3;
  84.   return THR_SYNC;
  85. }
  86.  
  87. /*** prog principal ***/
  88.  
  89. main(argc,argv)
  90.  
  91. unsigned int argc;
  92. char **argv;
  93.  
  94. {
  95. FILE *fr,*fw;
  96. long tape_size,bytes_read,length,end_adr,begin_adr,i=0,var;
  97. char *buff_origin,*buff_src;
  98. int correct=0,do_correct,err_found=0;
  99. char ch[200];
  100.  
  101. fr=fw=NULL;
  102. buff_src=NULL;
  103.  
  104. printf("\n-- Amoric TapeInfo -- Written by JF FABRE --\n\n");
  105. if (argc<2) Erreur("Usage : TapeInfo <tapefile>");
  106.  
  107. if ( (argc==3)&&(!strncmp(argv[1],"-c",2)) )
  108.   {
  109.    correct=1;
  110.    printf("** Correcting mode activated...\n\n");
  111.   }
  112.  
  113. if (!(fr=fopen(argv[1],"rb")))
  114.   {
  115.     if (argc==2) Erreur("Can't open source file !");
  116.     if (!(fr=fopen(argv[2],"rb"))) Erreur("Can't open source file !");
  117.   }
  118.     
  119. fseek(fr,0,SEEK_END);
  120. tape_size=ftell(fr);
  121. rewind(fr);
  122.  
  123. buff_src=(char *)malloc(tape_size);
  124.  
  125. if (buff_src==NULL) Erreur("Not enough memory !");
  126.  
  127. if (correct)
  128.   {
  129.    if ( (fw=fopen("T:OricTMP.DAT","wb")) ==NULL ) Erreur("Unable to open TMP file !! Correction aborted...\n");
  130.   }
  131.  
  132. printf("Loading source file : %s...\n",argv[1+correct]);
  133. bytes_read=fread(buff_src,1,tape_size,fr);
  134. fclose(fr);
  135. printf("File size : %d bytes.\nAnalysing tape...\n",bytes_read);
  136.  
  137. length=bytes_read;
  138.  
  139. do
  140. {
  141. buff_origin=buff_src;
  142.  
  143. printf("\nProgram %d : Offset $%x\n",i+1,tape_size-length);
  144.  
  145. switch (SeekSync(buff_src,&length))
  146.   {
  147.     case NO_SYNC:  if (!i) Erreur("No sync found...\n");
  148.                    i=-2;length=tape_size;break;
  149.     case ONE_SYNC: printf("Weak Sync found at offset $%x.\n",tape_size-length-2);buff_src+=2;do_correct=1;err_found=1;break;
  150.     case THR_SYNC: printf("Good Sync found at offset $%x.\n",tape_size-length-4);buff_src+=4;do_correct=0;break;
  151.   }
  152.  
  153. i++;
  154.  
  155. buff_src+=4;
  156.  
  157. end_adr=GetWord680x0(buff_src);
  158. begin_adr=GetWord680x0(buff_src+2);
  159.  
  160. buff_src+=5;
  161.  
  162. printf("Program name : %s\n",buff_src);
  163. printf("Start : $%x\011End : $%x\011Length : $%x\n", begin_adr,end_adr,end_adr-begin_adr-1);
  164.  
  165. if (begin_adr>=end_adr) Erreur("Incoherent start/end addresses");
  166.  
  167. if ((var=SeekZero(buff_src,length))==-1) Erreur("Name not terminated.");
  168.  
  169. buff_src+=var+end_adr-begin_adr+2;
  170. length-=11+var+end_adr-begin_adr;
  171.  
  172. if ((correct)&&(tape_size-length>0))
  173.   {
  174.   printf("Correcting part %d...\n",i);
  175.   if (do_correct)
  176.     {
  177.     fputc(0x16,fw);
  178.     fputc(0x16,fw);
  179.     }
  180.   if (length<=0) var--;
  181.   fwrite(buff_origin,1,13+var+end_adr-begin_adr,fw);
  182.   }
  183. if (length<=0) break;
  184.  
  185. }
  186.  
  187.  
  188. while (i!=-1);
  189.  
  190. CloseAll();
  191.  
  192. if (correct)
  193.   {
  194.   sprintf(ch,"c:copy T:OricTMP.DAT %s",argv[2]);
  195.  
  196.   DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",0);
  197.   if (err_found) Execute(ch,NULL,NULL);
  198.   DeleteFile("T:OricTMP.dat");
  199.   CloseLibrary((struct Library *)DOSBase);
  200.   }
  201.  
  202. }
  203.  
  204.  
  205.