/* ddos2dfs.c: Splitst DDOS diskdumps in aparte DFS diskbeelden * * Copyright (c) W.H. Scholten 1996 * (bbcim) 14-5-1996 */ #ifdef NL #define fout filebyte=ddos_no+65; printf("onverwacht einde van het diskbeeld" \ " bij ddos drive %c ",filebyte); #else #define fout filebyte=ddos_no+65; printf("Unexpected end of DDOS diskimage" \ " at ddos drive %c ",filebyte); #endif int ddos2dfs(char *disk, int verbose) { FILE *fpdfs, *fpdisk; char dfs_image[50], basisnaam[50]; unsigned char filebyte=0,H=0; long ddos_no, i, sectors_on_volume, length; int starttrack, startsector, l; struct diskimage image; /* bbcim_errno=0; */ /* not necessary as we call diskimage_sanitycheck */ image.type=DDOS_DISK; image.sides=1; image.filename=disk; if (diskimage_sanitycheck(&image, verbose)) return bbcim_errno; strcpy(basisnaam, disk); l=strlen(disk); if (!strcmp(disk+l-3,".dd")) basisnaam[l-3]=0; fpdisk=fopen(disk,"rb"); /* Hoofdlus: alle catalogi */ for (ddos_no=0; ddos_no<8; ddos_no++) { fseek(fpdisk,16*256L+8L+2*ddos_no,SEEK_SET); fread(&filebyte,1,1,fpdisk); starttrack=filebyte; if (starttrack !=0) { strcpy(dfs_image, basisnaam); filebyte=ddos_no+65; l=strlen(basisnaam); dfs_image[l]=filebyte; strcpy(dfs_image+l+1, ".bbc"); /* NU EEN TEST OF ER UBERHAUPT IETS OP DE DDOS CATALOGUS STAAT: */ fseek(fpdisk, (ddos_no*2+1)*256+5, SEEK_SET); fread(&filebyte,1,1,fpdisk); if (filebyte==0) { filebyte=65+ddos_no; if (verbose) printf(" Catalogus %c is leeg\n", filebyte); continue; } /* (DUS GEEN LEGE DISKBEELDEN) */ if (verbose) printf("%s\n",dfs_image); /* UITVOER BESTAND OPENEN. */ fpdfs=fopen(dfs_image, "wb"); fseek(fpdisk, (ddos_no*2+1)*256+6, SEEK_SET); fread(&filebyte,1,1,fpdisk); H=filebyte & 0x03; fread(&filebyte,1,1,fpdisk); /*long*/ sectors_on_volume=filebyte+H*256; /*long*/ length=sectors_on_volume*256; /* First sector & second sector: */ fseek(fpdisk, (ddos_no*2+0)*256, SEEK_SET); for(i=0; i<512; i++) { fread(&filebyte,1,1,fpdisk); if (feof(fpdisk)) { fout exit(1); } fwrite(&filebyte,1,1,fpdfs); } /* In the second sector, adjust the sector start addresses. */ /* NB: mag voor allemaal?? (ook als bv 2 best. gebruikt?) Denk wel. */ for(i=0; i<31; i++) { fseek(fpdisk, (ddos_no*2+1)*256+14L+i*8, SEEK_SET); fseek(fpdfs, 256L+i*8+14, SEEK_SET); fread(&filebyte,1,1,fpdisk); H=filebyte; fread(&filebyte,1,1,fpdisk); startsector=filebyte+H*256+2; H=startsector >>8; filebyte=startsector & 0xFF; fwrite(&H,1,1,fpdfs); fwrite(&filebyte,1,1,fpdfs); } /* Nu de rest: */ fseek(fpdisk,starttrack*18*256, SEEK_SET); for (i=0; i