static void detach_disk_image_and_free(disk_image_t *image, vdrive_t *floppy, unsigned int unit) { disk_image_t *oldimg; if (floppy == NULL || floppy->image == NULL) return; oldimg = floppy->image; detach_disk_image(image, floppy, unit); if ((image != NULL) && (image == oldimg)) disk_image_destroy(image); }
static int set_file_system_device(int val, void *param) { vdrive_t *vdrive; unsigned int unit = vice_ptr_to_uint(param); unsigned int idx; int old_device_enabled; if ((unit < 8) || (unit > 11)) { DBG(("set_file_system_device invalid dev #%d\n", unit)); return -1; } idx = unit - 8; old_device_enabled = file_system_device_enabled[idx]; vdrive = file_system_get_vdrive(unit); DBG(("set_file_system_device dev #%d old dev:%d new dev:%d\n", unit, old_device_enabled, val)); switch (val) { case ATTACH_DEVICE_NONE: if (old_device_enabled == ATTACH_DEVICE_REAL) { serial_realdevice_disable(); } if (old_device_enabled == ATTACH_DEVICE_RAW) { detach_disk_image(vdrive->image, vdrive, unit); } if (vdrive != NULL && vdrive->image == NULL) { vdrive_device_setup(vdrive, unit); serial_device_type_set(SERIAL_DEVICE_NONE, unit); file_system_set_serial_hooks(unit, 0); } break; case ATTACH_DEVICE_VIRT: if (old_device_enabled == ATTACH_DEVICE_REAL) { serial_realdevice_disable(); } if (old_device_enabled == ATTACH_DEVICE_RAW) { detach_disk_image(vdrive->image, vdrive, unit); } if (vdrive != NULL && vdrive->image == NULL) { vdrive_device_setup(vdrive, unit); serial_device_type_set(SERIAL_DEVICE_VIRT, unit); file_system_set_serial_hooks(unit, 0); } break; case ATTACH_DEVICE_FS: if (old_device_enabled == ATTACH_DEVICE_REAL) { serial_realdevice_disable(); } if (old_device_enabled == ATTACH_DEVICE_RAW) { detach_disk_image(vdrive->image, vdrive, unit); } if (vdrive != NULL && vdrive->image != NULL) { detach_disk_image_and_free(vdrive->image, vdrive, unit); ui_display_drive_current_image(idx, ""); } if (vdrive != NULL && vdrive->image == NULL) { vdrive_device_setup(vdrive, unit); serial_device_type_set(SERIAL_DEVICE_FS, unit); file_system_set_serial_hooks(unit, 1); } break; #ifdef HAVE_OPENCBM case ATTACH_DEVICE_REAL: if (old_device_enabled == ATTACH_DEVICE_RAW) { detach_disk_image(vdrive->image, vdrive, unit); } if (serial_realdevice_enable() < 0) { log_warning(attach_log, "Falling back to fs device."); return set_file_system_device(ATTACH_DEVICE_FS, param); } if (vdrive != NULL && vdrive->image != NULL) { detach_disk_image_and_free(vdrive->image, vdrive, unit); ui_display_drive_current_image(idx, ""); vdrive_device_setup(vdrive, unit); } serial_device_type_set(SERIAL_DEVICE_REAL, unit); break; #endif #ifdef HAVE_RAWDRIVE case ATTACH_DEVICE_RAW: if (old_device_enabled == ATTACH_DEVICE_REAL) { serial_realdevice_disable(); } if (vdrive != NULL && vdrive->image != NULL) { detach_disk_image_and_free(vdrive->image, vdrive, unit); ui_display_drive_current_image(idx, ""); vdrive_device_setup(vdrive, unit); } attach_disk_image(&(vdrive->image), vdrive, "DUMMY", unit, ATTACH_DEVICE_RAW); file_system_set_serial_hooks(unit, 0); serial_device_type_set(SERIAL_DEVICE_RAW, unit); break; #endif default: return -1; } file_system_device_enabled[idx] = val; return 0; }
static int set_file_system_device(int val, void *param) { vdrive_t *vdrive; unsigned int unit; int old_device_enabled; unit = (unsigned int)param; old_device_enabled = file_system_device_enabled[unit - 8]; vdrive = file_system_get_vdrive(unit); switch (val) { case ATTACH_DEVICE_NONE: if (old_device_enabled == ATTACH_DEVICE_REAL) serial_realdevice_disable(); if (old_device_enabled == ATTACH_DEVICE_RAW) detach_disk_image(vdrive->image, vdrive, unit); if (vdrive != NULL && vdrive->image == NULL) { vdrive_device_setup(vdrive, unit); serial_device_type_set(SERIAL_DEVICE_VIRT, unit); file_system_set_serial_hooks(unit, 0); } break; case ATTACH_DEVICE_FS: if (old_device_enabled == ATTACH_DEVICE_REAL) serial_realdevice_disable(); if (old_device_enabled == ATTACH_DEVICE_RAW) detach_disk_image(vdrive->image, vdrive, unit); if (vdrive != NULL && vdrive->image == NULL) { vdrive_device_setup(vdrive, unit); serial_device_type_set(SERIAL_DEVICE_FS, unit); file_system_set_serial_hooks(unit, 1); } break; #ifdef HAVE_OPENCBM case ATTACH_DEVICE_REAL: if (old_device_enabled == ATTACH_DEVICE_RAW) detach_disk_image(vdrive->image, vdrive, unit); if (serial_realdevice_enable() < 0) { log_warning(attach_log, "Falling back to fs device."); return set_file_system_device(ATTACH_DEVICE_FS, param); } if (vdrive != NULL && vdrive->image != NULL) { detach_disk_image_and_free(vdrive->image, vdrive, unit); ui_display_drive_current_image(unit - 8, ""); vdrive_device_setup(vdrive, unit); } serial_device_type_set(SERIAL_DEVICE_REAL, unit); break; #endif #ifdef HAVE_RAWDRIVE case ATTACH_DEVICE_RAW: if (old_device_enabled == ATTACH_DEVICE_REAL) serial_realdevice_disable(); if (vdrive != NULL && vdrive->image != NULL) { detach_disk_image_and_free(vdrive->image, vdrive, unit); ui_display_drive_current_image(unit - 8, ""); vdrive_device_setup(vdrive, unit); } attach_disk_image(&(vdrive->image), vdrive, "DUMMY", unit, ATTACH_DEVICE_RAW); file_system_set_serial_hooks(unit, 0); serial_device_type_set(SERIAL_DEVICE_RAW, unit); break; #endif default: return -1; } file_system_device_enabled[unit - 8] = val; return 0; }