Пример #1
0
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);
}
Пример #2
0
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]);
        }
    }
}