home *** CD-ROM | disk | FTP | other *** search
- int infile,outfile;
- long track[36];
-
- long lseek();
-
- char dir[16384];
- long fileread(tr,se,where)
- int tr,se;
- char *where;
- {
- long offset;
- char buffer[256];
- char *p;
- long len=0;
- int i;
-
- while()
- {
- offset=track[tr]+se*0x100L;
- lseek(infile,offset,0);
- read(infile,buffer,256);
- p=buffer;
- tr=*p++;
- se=*p++;
- if(tr)
- {
- for(i=0;i<254;i++) *where++=*p++;
- len+=254;
- }
- else
- {
- se--;
- for(i=0;i<se;i++) *where++=*p++;
- len+=se;
- return len;
- }
- }
- }
-
- long copy(tr,se,ohand)
- int tr,se,ohand;
- {
- long offset;
- char buffer[256];
- char *p;
- long len=0;
- int i;
-
- while()
- {
- offset=track[tr]+se*0x100L;
- lseek(infile,offset,0);
- read(infile,buffer,256);
- p=buffer;
- tr=*p++;
- se=*p++;
- if(tr)
- {
- write(ohand,p,254);
- len+=254;
- }
- else
- {
- se--;
- write(ohand,p,se);
- len+=se;
- return len;
- }
- }
- }
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- int i,j,num;
- long v;
- long len;
- char *p;
- char name[20];
- char fname[64];
- char oname[64];
-
- v=0;i=1;
- while(i<18) {track[i++]=v;v+=0x1500L;}
- while(i<25) {track[i++]=v;v+=0x1300L;}
- while(i<31) {track[i++]=v;v+=0x1200L;}
- while(i<36) {track[i++]=v;v+=0x1100L;}
-
- if(argc!=4)
- {
- puts("Use: CCOPY <imagefile> <file #> <outputname>\n");
- return;
- }
-
- strcpy(fname,argv[1]);
- infile=fopen(fname,"r");
- if(!infile)
- {
- strcat(fname,".d64");
- infile=fopen(fname,"r");
- if(!infile)
- {
- printf("Cannot open \"%s\"\n",argv[1]);
- return;
- }
- }
-
- p=argv[2];
- num=0;
- while(*p>='0' && *p<='9') num+=9*num + (*p++) -'0';
- len=fileread(18,0,dir);
-
- i=0;
- p=dir+0xfe;
- while(i!=num)
- {
- i++;
- p+=32;
- if((i&7)==0) p-=2;
- if(p-dir>=len) {puts("Illegal file number\n");return;}
- }
- outfile=fopen(argv[3],"w");
- if(!outfile)
- {
- printf("Cannot open %s for output\n",argv[3]);
- fclose(infile);
- return;
- }
- copy(p[1],p[2],outfile);
- fclose(outfile);
- fclose(infile);
- }
-