#include #include #include #include #include #include #include #include #define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0])) #define TRACK_SIZE 5325 void write_data(FILE *fp, uint8_t *buf, int len) { int i; uint8_t zero = 0; for (i = 0; i < len; i += 2) { fwrite(&buf[i+1], 1, 1, fp); fwrite(&buf[i], 1, 1, fp); fwrite(&zero, 1, 1, fp); } } int main(int argc, char *argv[]) { int done = 0; int rc; uint8_t type = 0; int cyls[] = {0, 256, 512, 1172}; int heads[] = {0, 4, 8, 7}; uint8_t buf[TRACK_SIZE*3]; uint8_t zeros[1000]; uint8_t metadata[TRACK_SIZE*2]; int metadata_ndx; uint8_t data[TRACK_SIZE*2]; int data_ndx; int ignore; int header_count; int data_fd, metadata_fd; int tracks = 0; int i; struct { int count; uint8_t value; } gaps[] = { {60, 0x4e}, {14, 0x00}, {21, 0x00}, {23, 0x00}, {15, 0x00}}; struct stat data_stat; int head, cyl, n, sector; int start_bytes; memset(zeros, 0, sizeof(zeros)); data_fd = open("convert.ext", O_RDONLY, 0666); if (data_fd < 1) { fprintf(stderr, "convert.ext open failed\n"); exit(1); } rc = fstat(data_fd, &data_stat); if (rc < 0) { fprintf(stderr, "convert.ext fstat failed\n"); exit(1); } type = 0; for (i = 1; i < ARRAYSIZE(cyls); i++) { if (data_stat.st_size == cyls[i] * heads[i] * 16 * 512) { type = i; } } if (type == 0) { fprintf(stderr, "no matching disk type for file size %d\n", data_stat.st_size); exit(1); } metadata_fd = open("convert.ext.metadata", O_RDONLY, 0666); if (metadata_fd < 1) { fprintf(stderr, "convert.ext.metadata open failed\n"); exit(1); } fwrite(&type, 1, 1, stdout); for (cyl = 0; cyl < cyls[type]; cyl++) { for (head = 0; head < heads[type]; head++) { start_bytes = ftell(stdout); for (n = 0; n < gaps[0].count/2; n++) { fwrite(&gaps[0].value, 1, 1, stdout); fwrite(&gaps[0].value, 1, 1, stdout); fwrite(zeros, 1, 1, stdout); } for (sector = 0; sector < 16; sector++) { for (n = 0; n < gaps[1].count/2; n++) { fwrite(&gaps[1].value, 1, 1, stdout); fwrite(&gaps[1].value, 1, 1, stdout); fwrite(zeros, 1, 1, stdout); } buf[0] = 0x41; buf[1] = 0xa1; buf[2] = 0x01; buf[3] = cyl; buf[4] = cyl >> 8; buf[5] = 0; buf[6] = sector; buf[7] = head; buf[8] = 0; buf[9] = 0xef; buf[10] = 0xbe; buf[11] = 0x02; fwrite(buf, 12, 1, stdout); for (n = 0; n < gaps[2].count/2; n++) { fwrite(&gaps[2].value, 1, 1, stdout); fwrite(&gaps[2].value, 1, 1, stdout); fwrite(zeros, 1, 1, stdout); } buf[0] = 0x43; buf[1] = 0xa1; buf[2] = 0x01; fwrite(buf, 3, 1, stdout); read(metadata_fd, buf, 24); write_data(stdout, buf, 24); buf[0] = 0xef; buf[1] = 0xbe; buf[2] = 0x02; fwrite(buf, 3, 1, stdout); for (n = 0; n < gaps[3].count/2; n++) { fwrite(&gaps[3].value, 1, 1, stdout); fwrite(&gaps[3].value, 1, 1, stdout); fwrite(zeros, 1, 1, stdout); } buf[0] = 0x43; buf[1] = 0xa1; buf[2] = 0x01; fwrite(buf, 3, 1, stdout); read(data_fd, buf, 512); write_data(stdout, buf, 512); buf[0] = 0xef; buf[1] = 0xbe; buf[2] = 0x02; fwrite(buf, 3, 1, stdout); for (n = 0; n < gaps[4].count/2; n++) { fwrite(&gaps[4].value, 1, 1, stdout); fwrite(&gaps[4].value, 1, 1, stdout); fwrite(zeros, 1, 1, stdout); } } fwrite(zeros, 5325*3 - (ftell(stdout) - start_bytes), 1, stdout); } } close(data_fd); close(metadata_fd); }