void fdi_seek(int drive, int track) { if (fdd_doublestep_40(drive)) { if (fdi2raw_get_tpi(fdi[drive].h) < 2) { track /= 2; } } if (!fdi[drive].f) return; if (track < 0) track = 0; if (track > fdi[drive].lasttrack) track = fdi[drive].lasttrack - 1; fdi[drive].track = track; fdi_read_revolution(drive); }
void img_seek(int drive, int track) { int side; int current_xdft = img[drive].xdf_type - 1; uint8_t sectors_fat, effective_sectors, sector_gap; /* Needed for XDF */ if (!img[drive].f) return; pclog("Seek drive=%i track=%i sectors=%i sector_size=%i sides=%i\n", drive, track, img[drive].sectors,img[drive].sector_size, img[drive].sides); // pclog(" %i %i\n", drive_type[drive], img[drive].tracks); if (img[drive].tracks <= 41 && fdd_doublestep_40(drive)) track /= 2; pclog("Disk seeked to track %i\n", track); disc_track[drive] = track; if (img[drive].sides == 2) { fseek(img[drive].f, track * img[drive].sectors * img[drive].sector_size * 2, SEEK_SET); fread(img[drive].track_data[0], img[drive].sectors * img[drive].sector_size, 1, img[drive].f); fread(img[drive].track_data[1], img[drive].sectors * img[drive].sector_size, 1, img[drive].f); } else { fseek(img[drive].f, track * img[drive].sectors * img[drive].sector_size, SEEK_SET); fread(img[drive].track_data[0], img[drive].sectors * img[drive].sector_size, 1, img[drive].f); } disc_sector_reset(drive, 0); disc_sector_reset(drive, 1); int sector, current_pos; if (img[drive].xdf_type) { sectors_fat = xdf_track0[current_xdft][0]; effective_sectors = xdf_track0[current_xdft][1]; sector_gap = xdf_track0[current_xdft][2]; if (!track) { /* Track 0, register sectors according to track 0 map. */ /* First, the "Side 0" buffer, will also contain one sector from side 1. */ current_pos = 0; for (sector = 0; sector < sectors_fat; sector++) { disc_sector_add(drive, 0, track, 0, sector+0x81, 2, img[drive].bitcell_period_300rpm, &img[drive].track_data[0][current_pos]); current_pos += 512; } disc_sector_add(drive, 1, track, 1, 0x81, 2, img[drive].bitcell_period_300rpm, &img[drive].track_data[0][current_pos]); current_pos += 512; for (sector = 0; sector < 8; sector++) { disc_sector_add(drive, 0, track, 0, sector+1, 2, img[drive].bitcell_period_300rpm, &img[drive].track_data[0][current_pos]); current_pos += 512; } /* Now the "Side 1" buffer, will also contain one sector from side 0. */ current_pos = 0; for (sector = 0; sector < 14; sector++) { disc_sector_add(drive, 1, track, 1, sector+0x82, 2, img[drive].bitcell_period_300rpm, &img[drive].track_data[1][current_pos]); current_pos += 512; } current_pos += (5 * 512); for (; sector < effective_sectors-1; sector++) { disc_sector_add(drive, 1, track, 1, sector+0x82, 2, img[drive].bitcell_period_300rpm, &img[drive].track_data[1][current_pos]); current_pos += 512; } current_pos += 512; } else { /* Non-zero track, this will have sectors of various sizes. */ /* First, the "Side 0" buffer. */ current_pos = 0; for (sector = 0; sector < xdf_spt[current_xdft]; sector++) { disc_sector_add(drive, xdf_map[current_xdft][sector][0], track, xdf_map[current_xdft][sector][0], xdf_map[current_xdft][sector][2] + 0x80, xdf_map[current_xdft][sector][2], img[drive].bitcell_period_300rpm, &img[drive].track_data[0][current_pos]); current_pos += (128 << xdf_map[current_xdft][sector][2]); } /* Then, the "Side 1" buffer. */ current_pos = 0; for (sector = xdf_spt[current_xdft]; sector < (xdf_spt[current_xdft] << 1); sector++) { disc_sector_add(drive, xdf_map[current_xdft][sector][0], track, xdf_map[current_xdft][sector][0], xdf_map[current_xdft][sector][2] + 0x80, xdf_map[current_xdft][sector][2], img[drive].bitcell_period_300rpm, &img[drive].track_data[1][current_pos]); current_pos += (128 << xdf_map[current_xdft][sector][2]); } } } else { for (side = 0; side < img[drive].sides; side++) { for (sector = 0; sector < img[drive].sectors; sector++) disc_sector_add(drive, side, track, side, sector+1, img_sector_size_code(drive), img[drive].bitcell_period_300rpm, &img[drive].track_data[side][sector * img->sector_size]); } } }