static int set_drive_true_emulation(int val, void *param) { unsigned int dnr; drive_t *drive; drive_true_emulation = val; machine_bus_status_truedrive_set((unsigned int)drive_true_emulation); if (val) { for (dnr = 0; dnr < DRIVE_NUM; dnr++) { drive = drive_context[dnr]->drive; if (drive->type != DRIVE_TYPE_NONE) { drive->enable = 1; if (drive->type == DRIVE_TYPE_2000 || drive->type == DRIVE_TYPE_4000) { drivecpu65c02_reset_clk(drive_context[dnr]); } else { drivecpu_reset_clk(drive_context[dnr]); } } } for (dnr = 0; dnr < DRIVE_NUM; dnr++) { drive_enable(drive_context[dnr]); } } else { for (dnr = 0; dnr < DRIVE_NUM; dnr++) { drive = drive_context[dnr]->drive; drive_disable(drive_context[dnr]); if (drive->image != NULL) { vdrive_bam_reread_bam(dnr + 8); } } } return 0; }
void drivecpu_reset(drive_context_t *drv) { int preserve_monitor; *(drv->clk_ptr) = 0; drivecpu_reset_clk(drv); preserve_monitor = drv->cpu->int_status->global_pending_int & IK_MONITOR; interrupt_cpu_status_reset(drv->cpu->int_status); if (preserve_monitor) { interrupt_monitor_trap_on(drv->cpu->int_status); } /* FIXME -- ugly, should be changed in interrupt.h */ interrupt_trigger_reset(drv->cpu->int_status, *(drv->clk_ptr)); }