/* This is called at every vsync. */ void drive_vsync_hook(void) { unsigned int dnr; drive_update_ui_status(); for (dnr = 0; dnr < DRIVE_NUM; dnr++) { drive_t *drive = drive_context[dnr]->drive; if (drive->enable) { if (drive->idling_method != DRIVE_IDLE_SKIP_CYCLES) { if (drive->type == DRIVE_TYPE_2000 || drive->type == DRIVE_TYPE_4000) { drivecpu65c02_execute(drive_context[dnr], maincpu_clk); } else { drivecpu_execute(drive_context[dnr], maincpu_clk); } } if (drive->idling_method == DRIVE_IDLE_NO_IDLE) { /* if drive is never idle, also rotate the disk. this prevents * huge peaks in cpu usage when the drive must catch up with * a longer period of time. */ rotation_rotate_disk(drive); } /* printf("drive_vsync_hook drv %d @clk:%d\n", dnr, maincpu_clk); */ } } }
void drivesync_set_1571(int new_sync, struct drive_context_s *drv) { unsigned int dnr; dnr = drv->mynumber; if (rom_loaded) { if (drv->drive->byte_ready_active == 0x06) rotation_rotate_disk(drv->drive); rotation_init(new_sync ? 1 : 0, dnr); drv->drive->clock_frequency = (new_sync) ? 2 : 1; drivesync_factor(drv); } }
int drive_set_disk_drive_type(unsigned int type, struct drive_context_s *drv) { unsigned int dnr; drive_t *drive; drive_t *drive1; dnr = drv->mynumber; if (machine_drive_rom_check_loaded(type) < 0) { return -1; } drive = drv->drive; rotation_rotate_disk(drive); drivesync_clock_frequency(type, drive); rotation_init(0, dnr); drive->type = type; if (type == DRIVE_TYPE_2000 || type == DRIVE_TYPE_4000) { drivecpu65c02_setup_context(drv, 0); } else { drivecpu_setup_context(drv, 0); } drive->side = 0; machine_drive_rom_setup_image(dnr); drivesync_factor(drv); drive_set_active_led_color(type, dnr); /* set up (relatively) easy detection of dual drives */ drive1 = drive_context[mk_drive1(dnr)]->drive; drive->drive0 = NULL; drive1->drive1 = NULL; if (is_drive0(dnr) && drive_check_dual(type)) { drive->drive1 = drive1; drive1->drive0 = drive; } else { drive->drive1 = NULL; drive1->drive0 = NULL; } if (type == DRIVE_TYPE_2000 || type == DRIVE_TYPE_4000) { drivecpu65c02_init(drv, type); } else { drivecpu_init(drv, type); } return 0; }
int drive_set_disk_drive_type(unsigned int type, struct drive_context_s *drv) { unsigned int dnr; dnr = drv->mynumber; if (machine_drive_rom_check_loaded(type) < 0) return -1; rotation_rotate_disk(drv->drive); drivesync_clock_frequency(type, drv->drive); rotation_init(0, dnr); drv->drive->type = type; drv->drive->side = 0; machine_drive_rom_setup_image(dnr); drivesync_factor(drv); drive_set_active_led_color(type, dnr); drivecpu_init(drv, type); return 0; }