home *** CD-ROM | disk | FTP | other *** search
/ 64'er / 64ER_CD.iso / utilpc / d64util / ccopy.c next >
C/C++ Source or Header  |  1994-03-29  |  2KB  |  134 lines

  1. int infile,outfile;
  2. long track[36];
  3.  
  4. long lseek();
  5.  
  6. char dir[16384];
  7. long fileread(tr,se,where)
  8. int tr,se;
  9. char *where;
  10. {
  11. long offset;
  12. char buffer[256];
  13. char *p;
  14. long len=0;
  15. int i;
  16.  
  17.     while()
  18.     {
  19.         offset=track[tr]+se*0x100L;
  20.         lseek(infile,offset,0);
  21.         read(infile,buffer,256);
  22.         p=buffer;
  23.         tr=*p++;
  24.         se=*p++;
  25.         if(tr)
  26.         {
  27.             for(i=0;i<254;i++) *where++=*p++;
  28.             len+=254;
  29.         }
  30.         else
  31.         {
  32.             se--;
  33.             for(i=0;i<se;i++) *where++=*p++;
  34.             len+=se;
  35.             return len;
  36.         }
  37.     }
  38. }
  39.  
  40. long copy(tr,se,ohand)
  41. int tr,se,ohand;
  42. {
  43. long offset;
  44. char buffer[256];
  45. char *p;
  46. long len=0;
  47. int i;
  48.  
  49.     while()
  50.     {
  51.         offset=track[tr]+se*0x100L;
  52.         lseek(infile,offset,0);
  53.         read(infile,buffer,256);
  54.         p=buffer;
  55.         tr=*p++;
  56.         se=*p++;
  57.         if(tr)
  58.         {
  59.             write(ohand,p,254);
  60.             len+=254;
  61.         }
  62.         else
  63.         {
  64.             se--;
  65.             write(ohand,p,se);
  66.             len+=se;
  67.             return len;
  68.         }
  69.     }
  70. }
  71.  
  72. main(argc,argv)
  73. int argc;
  74. char *argv[];
  75. {
  76. int i,j,num;
  77. long v;
  78. long len;
  79. char *p;
  80. char name[20];
  81. char fname[64];
  82. char oname[64];
  83.  
  84.     v=0;i=1;
  85.     while(i<18) {track[i++]=v;v+=0x1500L;}
  86.     while(i<25) {track[i++]=v;v+=0x1300L;}
  87.     while(i<31) {track[i++]=v;v+=0x1200L;}
  88.     while(i<36) {track[i++]=v;v+=0x1100L;}
  89.  
  90.     if(argc!=4)
  91.     {
  92.         puts("Use: CCOPY <imagefile> <file #> <outputname>\n");
  93.         return;
  94.     }
  95.  
  96.     strcpy(fname,argv[1]);
  97.     infile=fopen(fname,"r");
  98.     if(!infile)
  99.     {
  100.         strcat(fname,".d64");
  101.         infile=fopen(fname,"r");
  102.         if(!infile)
  103.         {
  104.         printf("Cannot open \"%s\"\n",argv[1]);
  105.         return;
  106.         }
  107.     }
  108.  
  109.     p=argv[2];
  110.     num=0;
  111.     while(*p>='0' && *p<='9') num+=9*num + (*p++) -'0';
  112.     len=fileread(18,0,dir);
  113.  
  114.     i=0;
  115.     p=dir+0xfe;
  116.     while(i!=num)
  117.     {
  118.         i++;
  119.         p+=32;
  120.         if((i&7)==0) p-=2;
  121.         if(p-dir>=len) {puts("Illegal file number\n");return;}
  122.     }
  123.     outfile=fopen(argv[3],"w");
  124.     if(!outfile)
  125.     {
  126.         printf("Cannot open %s for output\n",argv[3]);
  127.         fclose(infile);
  128.         return;
  129.     }
  130.     copy(p[1],p[2],outfile);
  131.     fclose(outfile);
  132.     fclose(infile);
  133. }
  134.