void drive_gcr_data_writeback(drive_t *drive) { int extend; unsigned int half_track, track; if (drive->image == NULL) { return; } half_track = drive->current_half_track + drive->side * 70; track = drive->current_half_track / 2; if (drive->image->type == DISK_IMAGE_TYPE_P64) { return; } if (!(drive->GCR_dirty_track)) { return; } if (drive->image->type == DISK_IMAGE_TYPE_G64) { disk_image_write_half_track(drive->image, half_track, &drive->gcr->tracks[half_track - 2]); drive->GCR_dirty_track = 0; return; } if (half_track > drive->image->max_half_tracks) { drive->GCR_dirty_track = 0; return; } if (track > drive->image->tracks) { switch (drive->extend_image_policy) { case DRIVE_EXTEND_NEVER: drive->ask_extend_disk_image = 1; drive->GCR_dirty_track = 0; return; case DRIVE_EXTEND_ASK: if (drive->ask_extend_disk_image == 1) { extend = ui_extend_image_dialog(); if (extend == 0) { drive->GCR_dirty_track = 0; drive->ask_extend_disk_image = 0; return; } drive->ask_extend_disk_image = 2; } else if (drive->ask_extend_disk_image == 0) { drive->GCR_dirty_track = 0; return; } break; case DRIVE_EXTEND_ACCESS: drive->ask_extend_disk_image = 1; break; } } disk_image_write_half_track(drive->image, half_track, &drive->gcr->tracks[half_track - 2]); drive->GCR_dirty_track = 0; }
void drive_gcr_data_writeback(drive_t *drive) { int extend; unsigned int half_track, track, sector, max_sector = 0; BYTE buffer[260], *offset; if (drive->image == NULL) { return; } half_track = drive->current_half_track; track = drive->current_half_track / 2; if (drive->image->type == DISK_IMAGE_TYPE_P64) { return; } if (!(drive->GCR_dirty_track)) { return; } if (drive->image->type == DISK_IMAGE_TYPE_G64) { BYTE *gcr_track_start_ptr; unsigned int gcr_current_track_size; gcr_current_track_size = drive->gcr->track_size[half_track - 2]; gcr_track_start_ptr = drive->gcr->data + ((half_track - 2) * drive->gcr->max_track_size); disk_image_write_half_track(drive->image, half_track, gcr_current_track_size, drive->gcr->speed_zone, gcr_track_start_ptr); drive->GCR_dirty_track = 0; return; } if (drive->image->type == DISK_IMAGE_TYPE_D64 || drive->image->type == DISK_IMAGE_TYPE_X64) { if (track > EXT_TRACKS_1541) return; max_sector = disk_image_sector_per_track(DISK_IMAGE_TYPE_D64, track); if (track > drive->image->tracks) { switch (drive->extend_image_policy) { case DRIVE_EXTEND_NEVER: drive->ask_extend_disk_image = 1; return; case DRIVE_EXTEND_ASK: if (drive->ask_extend_disk_image == 1) { extend = ui_extend_image_dialog(); if (extend == 0) { drive->ask_extend_disk_image = 0; return; } else { drive_extend_disk_image(drive); } } else { return; } break; case DRIVE_EXTEND_ACCESS: drive->ask_extend_disk_image = 1; drive_extend_disk_image(drive); break; } } } if (drive->image->type == DISK_IMAGE_TYPE_D71) { if (track > MAX_TRACKS_1571) return; max_sector = disk_image_sector_per_track(DISK_IMAGE_TYPE_D71, track); } drive->GCR_dirty_track = 0; for (sector = 0; sector < max_sector; sector++) { offset = gcr_find_sector_header(track, sector, drive->GCR_track_start_ptr, drive->GCR_current_track_size); if (offset == NULL) { log_error(drive->log, "Could not find header of T:%d S:%d.", track, sector); } else { offset = gcr_find_sector_data(offset, drive->GCR_track_start_ptr, drive->GCR_current_track_size); if (offset == NULL) { log_error(drive->log, "Could not find data sync of T:%d S:%d.", track, sector); } else { gcr_data_writeback2(buffer, offset, track, sector, drive); } } } }