105 lines
2.5 KiB
Text
105 lines
2.5 KiB
Text
#include <stdio.h>
|
|
|
|
struct dir0 {
|
|
unsigned short dfirstblk;
|
|
unsigned short dflastblk;
|
|
unsigned short dfkind;
|
|
char length;
|
|
char dvid[7];
|
|
unsigned short deovblk;
|
|
unsigned short dnumfiles;
|
|
unsigned short dloadtime;
|
|
unsigned short dlastboot;
|
|
unsigned short padding;
|
|
};
|
|
struct dirn {
|
|
unsigned short dfirstblk;
|
|
unsigned short dflastblk;
|
|
unsigned short dfkind;
|
|
char length;
|
|
char dtid[15];
|
|
unsigned short dlastbyte;
|
|
unsigned short daccess;
|
|
};
|
|
|
|
unsigned short swap(unsigned short x) {
|
|
union u {
|
|
unsigned short x;
|
|
unsigned char c[2];
|
|
} u;
|
|
unsigned char s;
|
|
u.x = x;
|
|
s = u.c[0];
|
|
u.c[0] = u.c[1];
|
|
u.c[1] = s;
|
|
return u.x;
|
|
}
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
char name[17];
|
|
char cbuf[512];
|
|
char buf[512*4];
|
|
FILE* in,*out;
|
|
int i,n,k;
|
|
int b,e,l;
|
|
struct dir0* dir0;
|
|
struct dirn* dirn;
|
|
|
|
if (argc != 2) {
|
|
fprintf(stderr,"Usage: %s diskimage.bin\n",argv[0]);
|
|
exit (1);
|
|
}
|
|
|
|
if ((in=fopen(argv[1],"rb"))==NULL) {
|
|
fprintf(stderr,"Can't read %s\n",argv[1]);
|
|
exit(2);
|
|
}
|
|
|
|
/* read boot block (two sectors) */
|
|
printf("Extract boot record\n");
|
|
fread(buf,2,512,in);
|
|
out = fopen("bootrec.bin","wb");
|
|
fwrite(buf,2,512,out);
|
|
fclose(out);
|
|
|
|
/* read directory records */
|
|
fread(buf,4,512,in);
|
|
dir0 = (struct dir0*)buf;
|
|
dirn = (struct dirn*)(buf+26);
|
|
printf("Directory:\n");
|
|
printf(" firstblock=%d\n",swap(dir0->dfirstblk));
|
|
printf(" lastblock=%d\n",swap(dir0->dflastblk));
|
|
printf(" volumeid=");
|
|
for (i=0; i<dir0->length; i++) printf("%c",dir0->dvid[i]);
|
|
putchar('\n');
|
|
printf(" lastblock=%d\n",swap(dir0->deovblk));
|
|
printf(" numfiles=%d\n",swap(dir0->dnumfiles));
|
|
|
|
for (n=0; n<swap(dir0->dnumfiles); n++) {
|
|
if (dirn[n].dfkind) {
|
|
printf("\nFile=");
|
|
for (i=0; i<dirn[n].length; i++) printf("%c",dirn[n].dtid[i]);
|
|
putchar('\n');
|
|
b = swap(dirn[n].dfirstblk);
|
|
e = swap(dirn[n].dflastblk);
|
|
l = swap(dirn[n].dlastbyte);
|
|
printf(" firstblock=%d\n",b);
|
|
printf(" lastblock=%d\n",e);
|
|
printf(" filetype=0x%04x\n",swap(dirn[n].dfkind));
|
|
printf(" lastbyte=%d\n",l);
|
|
memset(name,0,17);
|
|
strncpy(name,dirn[n].dtid,dirn[n].length);
|
|
out = fopen(name,"wb");
|
|
fseek(in,b*512,0);
|
|
for (k=0; k<(e-b)-1; k++) {
|
|
fread(cbuf,1,512,in);
|
|
fwrite(cbuf,1,512,out);
|
|
}
|
|
fread(cbuf,1,l,in);
|
|
fwrite(cbuf,1,l,out);
|
|
fclose(out);
|
|
}
|
|
}
|
|
}
|