#include #include #include #define PAGESIZE 2048 #define PAGECOUNT 720 void write_block(FILE *, char *, int); void make_bootable(FILE *); char page[PAGESIZE]; /* * amalgam8 - take the various BefOS program binary files * and create a bootable disk image containing them. */ int main(int argc, char **argv) { int i = 1; FILE *outfile; if ((outfile = fopen(argv[1], "w")) == NULL) errx(1, "cannot create `%s'", argv[1]); /* blank out f by writing n number of blocks of zeroes to it */ bzero(page, PAGESIZE); for (i = 0; i < PAGECOUNT; i++) fwrite(page, PAGESIZE, 1, outfile); for (i = 2; i < (argc-1); i += 2) write_block(outfile, argv[i], atoi(argv[i+1])); make_bootable(outfile); fclose(outfile); } void write_block(FILE *outfile, char *filename, int pagepos) { FILE *infile; int pos = pagepos * PAGESIZE; int block = 1; printf("writing %s at page %d...\n", filename, pagepos); if ((infile = fopen(filename, "r")) == NULL) errx(1, "cannot read `%s'", filename); while(!feof(infile)) { printf("\twriting block %d...\n", block++); bzero(page, PAGESIZE); fread(page, PAGESIZE, 1, infile); fseek(outfile, pos, SEEK_SET); fwrite(page, PAGESIZE, 1, outfile); pos += PAGESIZE; } } void make_bootable(FILE *outfile) { fseek(outfile, 510, SEEK_SET); fwrite("\x55\xaa", 2, 1, outfile); }