int fsimage_gcr_write_sector(disk_image_t *image, const BYTE *buf, const disk_addr_t *dadr) { if (dadr->track > image->tracks) { log_error(fsimage_gcr_log, "Track %i out of bounds. Cannot write GCR sector", dadr->track); return -1; } if (image->gcr == NULL) { disk_track_t raw; if (fsimage_gcr_read_track(image, dadr->track, &raw) < 0 || raw.data == NULL) { return -1; } if (gcr_write_sector(&raw, buf, (BYTE)dadr->sector) != CBMDOS_FDC_ERR_OK) { log_error(fsimage_gcr_log, "Could not find track %i sector %i in disk image", dadr->track, dadr->sector); lib_free(raw.data); return -1; } if (fsimage_gcr_write_track(image, dadr->track, &raw) < 0) { lib_free(raw.data); return -1; } lib_free(raw.data); } else { if (gcr_write_sector(&image->gcr->tracks[(dadr->track * 2) - 2], buf, (BYTE)dadr->sector) != CBMDOS_FDC_ERR_OK) { log_error(fsimage_gcr_log, "Could not find track %i sector %i in disk image", dadr->track, dadr->sector); return -1; } if (fsimage_gcr_write_track(image, dadr->track, &image->gcr->tracks[(dadr->track * 2) - 2]) < 0) { log_error(fsimage_gcr_log, "Failed writing track %i to disk image.", dadr->track); return -1; } } return 0; }
int fsimage_dxx_write_sector(disk_image_t *image, const BYTE *buf, const disk_addr_t *dadr) { int sectors; long offset; fsimage_t *fsimage; fsimage = image->media.fsimage; sectors = disk_image_check_sector(image, dadr->track, dadr->sector); if (sectors < 0) { log_error(fsimage_dxx_log, "Track: %i, Sector: %i out of bounds.", dadr->track, dadr->sector); return -1; } offset = sectors * 256; if (image->type == DISK_IMAGE_TYPE_X64) { offset += X64_HEADER_LENGTH; } if (util_fpwrite(fsimage->fd, buf, 256, offset) < 0) { log_error(fsimage_dxx_log, "Error writing T:%i S:%i to disk image.", dadr->track, dadr->sector); return -1; } if (image->gcr != NULL) { gcr_write_sector(&image->gcr->tracks[(dadr->track * 2) - 2], buf, (BYTE)dadr->sector); } if ((fsimage->error_info.map != NULL) && (fsimage->error_info.map[sectors] != CBMDOS_FDC_ERR_OK)) { offset = fsimage->error_info.len * 256 + sectors; if (image->type == DISK_IMAGE_TYPE_X64) { offset += X64_HEADER_LENGTH; } fsimage->error_info.map[sectors] = CBMDOS_FDC_ERR_OK; if (util_fpwrite(fsimage->fd, &fsimage->error_info.map[sectors], 1, offset) < 0) { log_error(fsimage_dxx_log, "Error writing T:%i S:%i error info to disk image.", dadr->track, dadr->sector); } } /* Make sure the stream is visible to other readers. */ fflush(fsimage->fd); return 0; }
int fsimage_p64_write_sector(disk_image_t *image, BYTE *buf, unsigned int track, unsigned int sector) { unsigned int max_track_length = NUM_MAX_MEM_BYTES_TRACK; BYTE *gcr_data; BYTE *gcr_track_start_ptr, *speed_zone; int gcr_track_size, gcr_current_track_size; if (track > 42) { log_error(fsimage_p64_log, "Track %i out of bounds. Cannot write P64 sector", track); return -1; } gcr_data = (BYTE*) lib_malloc(max_track_length); if (fsimage_p64_read_track(image, track, gcr_data, &gcr_track_size) < 0) { log_error(fsimage_p64_log, "Cannot read track %i from P64 image.", track); lib_free(gcr_data); return -1; } gcr_track_start_ptr = gcr_data; gcr_current_track_size = gcr_track_size; speed_zone = NULL; if (gcr_write_sector(gcr_track_start_ptr, gcr_current_track_size, buf, track, sector) < 0) { log_error(fsimage_p64_log, "Could not find track %i sector %i in disk image", track, sector); lib_free(gcr_data); return -1; } if (fsimage_p64_write_track(image, track, gcr_current_track_size, speed_zone, gcr_track_start_ptr) < 0) { log_error(fsimage_p64_log, "Failed writing track %i to disk image.", track); lib_free(gcr_data); return -1; } lib_free(gcr_data); return 0; }