+// Attach a headerless HDD image to the controller
+int ide_attach_hdf(struct ide_controller *c, int drive, int fd)
+{
+ struct ide_drive *d = &c->drive[drive];
+ if (d->present) {
+ printf("[IDE/HDL] Drive already attached.\n");
+ return -1;
+ }
+
+ d->fd = fd;
+ d->present = 1;
+ d->lba = 0;
+
+ d->heads = 255;
+ d->sectors = 63;
+ d->header_present = 0;
+
+ uint64_t file_size = lseek(fd, 0, SEEK_END);
+ lseek(fd, 1024, SEEK_SET);
+
+ if (file_size < 500 * SIZE_MEGA) {
+ d->heads = 16;
+ }
+ else if (file_size < 1000 * SIZE_MEGA) {
+ d->heads = 32;
+ }
+ else if (file_size < 2000 * SIZE_MEGA) {
+ d->heads = 64;
+ }
+ else if (file_size < (uint64_t)4000 * SIZE_MEGA) {
+ d->heads = 128;
+ }
+
+ d->cylinders = (file_size / 512) / (d->sectors * d->heads);
+
+ printf("[IDE/HDL] Cylinders: %d Heads: %d Sectors: %d\n", d->cylinders, d->heads, d->sectors);
+
+ if (file_size >= 4 * 1000 * 1000) {
+ d->lba = 1;
+ }
+
+ ide_make_ident(d->cylinders, d->heads, d->sectors, "PISTORM HDD IMAGE v0.1", d->identify);
+
+ return 0;
+}
+