From: matchbox Newsgroups: comp.emulators.apple2 Subject: Dos 3.3 file extracter C source Date: Thu, 03 Oct 1996 22:31:16 +0900 Organization: Black Mountain Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Message-ID: <3253C024.60D5@nuri.net> /* dsktool.c */ /* 1996.9.29 (Hitel: sukgab) (Email: matchbox@nuri.net) */ #include #include #define TRACK_VTOC 0x11 #define SECTOR_VTOC 0x0 #define BYTE4SECTOR 256 #define SECTOR4TRACK 16 #define MAXFILE 50 #define BYTE unsigned char FILE *dskfp; FILE *outfp; int main(int argc,char *argv[]) { char *filename,*outfile; unsigned char onebyte; int filetype; int i,j; int fileno,selected; int track_list[MAXFILE], sector_list[MAXFILE]; int track,sector,t,s; char flag,asciimode=0; unsigned long vtoc,catalog,eachfile,tslist,target; unsigned long sector_cat, track_cat; vtoc= (long) SECTOR_VTOC * BYTE4SECTOR + (long) TRACK_VTOC * BYTE4SECTOR * SECTOR4TRACK; if (argc<2) { printf("Usage: \n"); printf(" dsktool filename.dsk\n"); exit(1); } filename= argv[1]; printf("filename: %s\n",filename); if( strcmpi ( argv[2], "/a" ) ==0 ) asciimode=1; dskfp= fopen( filename, "rb" ); if (dskfp==NULL) { printf("File %s openning Error \n", filename); exit(1); } fseek( dskfp, vtoc+1, SEEK_SET); /* Now, virtual header is located on VTOC */ track_cat = fgetc ( dskfp ); sector_cat = fgetc ( dskfp ); printf("%0X:%0X\n", track_cat, sector_cat); if ( fgetc( dskfp ) != 3 ) { printf ("This dsk file may not have dos 3.3 format\n"); exit(1); } fseek( dskfp, vtoc+ 6, SEEK_SET); printf("Disk Volume: %d \n", fgetc( dskfp ) ); /* Now, We will place virtual header on Catalog-Sector */ flag=0; fileno=0; do { catalog= track_cat*BYTE4SECTOR*SECTOR4TRACK+ sector_cat*BYTE4SECTOR; fseek( dskfp, catalog + 1, SEEK_SET); track_cat= fgetc ( dskfp ); sector_cat= fgetc ( dskfp ); if (track_cat == 0 && sector_cat==0) flag=1; /* Exit from this loop */ for (i=0;i<7;i++) { eachfile= catalog+ 0x0B + i* 0x23; fseek( dskfp, eachfile, SEEK_SET); track_list[fileno]= fgetc ( dskfp ); sector_list[fileno]= fgetc ( dskfp ); if ( track_list[fileno] == 0xFF || track_list[fileno] == 0 ) { flag=1; break; } printf("%3d : ", fileno); filetype=fgetc ( dskfp ); switch (filetype) { case 0x00: case 0x80: printf("T"); break; case 0x01: case 0x81: printf("I"); break; case 0x02: case 0x82: printf("A"); break; case 0x04: case 0x84: printf("B"); break; default: printf("?"); } printf("- "); for(j=0;j<30;j++) putch( fgetc( dskfp ) & 0x7F ); printf("(%03d)\n", fgetc( dskfp ) + fgetc( dskfp )*256 ); fileno++; } } while ( flag==0 ); printf("Select FileNumber:"); scanf("%d",&selected); if(selected>fileno) { printf("Error: no file\n"); exit(1); } printf("Output Filename:"); scanf("%s",outfile); outfp = fopen ( outfile,"wb"); track= track_list[ selected ]; sector= sector_list [ selected ]; printf("%d,%d\n", track,sector); flag=0; do{ tslist= (long)track*BYTE4SECTOR*SECTOR4TRACK+ (long)sector*BYTE4SECTOR; fseek( dskfp, tslist+1, SEEK_SET); track= fgetc ( dskfp ); sector= fgetc ( dskfp ); if ( track==0 ) flag=1; for(j=0;j<122;j++) { fseek( dskfp, tslist+ 0x0C + j*2, SEEK_SET); t= fgetc ( dskfp ); s= fgetc ( dskfp ); if (t==0) { flag=1; break; } printf("Reading t:%d,s:%d\n ",t,s); target= (long)t*BYTE4SECTOR*SECTOR4TRACK+ (long) s*BYTE4SECTOR; fseek( dskfp, target, SEEK_SET); printf("Writing sector\n"); for(i=0;i<256;i++) { onebyte= fgetc( dskfp ); if ( asciimode!=0 ) onebyte = onebyte & 0x7f; fputc( onebyte, outfp ); } } } while ( flag==0 ); fclose (dskfp); fclose (outfp); return (0); }