Example #1
0
/* Attach a disk image to the true drive emulation. */
int drive_image_attach(disk_image_t *image, unsigned int unit)
{
    unsigned int dnr;
    drive_t *drive;

    if (unit < 8 || unit >= 8 + DRIVE_NUM) {
        return -1;
    }

    dnr = unit - 8;
    drive = drive_context[dnr]->drive;

    if (drive_check_image_format(image->type, dnr) < 0) {
        return -1;
    }

    drive->read_only = image->read_only;
    drive->attach_clk = drive_clk[dnr];
    if (drive->detach_clk > (CLOCK)0) {
        drive->attach_detach_clk = drive_clk[dnr];
    }
    drive->ask_extend_disk_image = 1;

    switch (image->type) {
        case DISK_IMAGE_TYPE_D64:
        case DISK_IMAGE_TYPE_D67:
        case DISK_IMAGE_TYPE_D71:
        case DISK_IMAGE_TYPE_G64:
        case DISK_IMAGE_TYPE_X64:
        case DISK_IMAGE_TYPE_P64:
            disk_image_attach_log(image, driveimage_log, unit);
            break;
        default:
            return -1;
    }

    drive->image = image;
    drive->image->gcr = drive->gcr;
    drive->image->p64 = (void*)drive->p64;

    if (disk_image_read_image(drive->image) < 0) {
        drive->image = NULL;
        return -1;
    }
    if (drive->image->type == DISK_IMAGE_TYPE_P64) {
        drive->P64_image_loaded = 1;
        drive->P64_dirty = 0;
    } else {
        drive->GCR_image_loaded = 1;
    }
    drive->complicated_image_loaded = (drive->image->type == DISK_IMAGE_TYPE_P64
                                       || drive->image->type == DISK_IMAGE_TYPE_G64);
    drive_set_half_track(drive->current_half_track, drive->side, drive);
    return 0;
}
Example #2
0
/* Attach a disk image to the true drive emulation. */
int drive_image_attach(disk_image_t *image, unsigned int unit)
{
	unsigned int dnr;
	drive_t *drive;

	if (unit < 8 || unit >= 8 + DRIVE_NUM)
		return -1;

	dnr = unit - 8;
	drive = drive_context[dnr]->drive;

	if (drive_check_image_format(image->type, dnr) < 0)
		return -1;

	drive->read_only = image->read_only;
	drive->attach_clk = drive_clk[dnr];
	if (drive->detach_clk > (CLOCK)0)
		drive->attach_detach_clk = drive_clk[dnr];
	drive->ask_extend_disk_image = 1;

	switch(image->type)
	{
		case DISK_IMAGE_TYPE_D64:
		case DISK_IMAGE_TYPE_D67:
		case DISK_IMAGE_TYPE_D71:
		case DISK_IMAGE_TYPE_G64:
		case DISK_IMAGE_TYPE_X64:
			disk_image_attach_log(image, 0, unit);
			break;
		default:
			return -1;
	}

	drive->image = image;
	drive->image->gcr = drive->gcr;

	if (drive->image->type == DISK_IMAGE_TYPE_G64) {
		if (disk_image_read_gcr_image(drive->image) < 0) {
			drive->image = NULL;
			return -1;
		}
	} else {
		if (setID(dnr) >= 0) {
			drive_image_read_d64_d71(drive);
			drive->GCR_image_loaded = 1;
			return 0;
		} else {
			return -1;
		}
	}
	drive->GCR_image_loaded = 1;

	return 0;
}