void st_fdc_free (st_fdc_t *fdc) { unsigned i; for (i = 0; i < 2; i++) { st_fdc_save (fdc, i); pri_img_del (fdc->img[i]); free (fdc->fname[i]); } wd179x_free (&fdc->wd179x); }
int st_fdc_load (st_fdc_t *fdc, unsigned drive) { pri_img_t *img; if (drive >= 2) { return (1); } wd179x_flush (&fdc->wd179x, drive); wd179x_set_ready (&fdc->wd179x, drive, 0); wd179x_set_wprot (&fdc->wd179x, drive, 1); fdc->media_change[drive] = 1; fdc->media_change_clk = 8000000 / 10; pri_img_del (fdc->img[drive]); fdc->img[drive] = NULL; fdc->use_fname[drive] = 0; fdc->modified[drive] = 0; img = NULL; if (fdc->fname[drive] != NULL) { img = st_fdc_load_pri (fdc, drive); if (img != NULL) { fdc->use_fname[drive] = 1; st_log_deb ("fdc: loading drive %u (pri)\n", drive); } } if (img == NULL) { img = st_fdc_load_disk (fdc, drive); if (img != NULL) { st_log_deb ("fdc: loading drive %u (disk)\n", drive); } } if (img == NULL) { st_log_deb ("fdc: unloading drive %u\n", drive); return (1); } fdc->img[drive] = img; wd179x_set_ready (&fdc->wd179x, drive, 1); return (0); }
static int pri_encode (pri_img_t **img, const char *type, const char *fname) { psi_img_t *simg; pri_img_t *dimg; if ((simg = psi_load (fname, PSI_FORMAT_NONE)) == NULL) { return (1); } if (strcmp (type, "gcr") == 0) { dimg = pri_encode_gcr (simg); } else if (strcmp (type, "mfm") == 0) { dimg = pri_encode_mfm (simg, &par_mfm); } else if (strcmp (type, "mfm-dd-300") == 0) { par_mfm.clock = 500000; par_mfm.track_size = 500000 / 5; dimg = pri_encode_mfm (simg, &par_mfm); } else if (strcmp (type, "mfm-hd-300") == 0) { par_mfm.clock = 1000000; par_mfm.track_size = 1000000 / 5; dimg = pri_encode_mfm (simg, &par_mfm); } else if (strcmp (type, "mfm-hd-360") == 0) { par_mfm.clock = 1000000; par_mfm.track_size = 1000000 / 6; dimg = pri_encode_mfm (simg, &par_mfm); } else { dimg = NULL; } if ((dimg != NULL) && (simg->comment_size > 0)) { pri_img_set_comment (dimg, simg->comment, simg->comment_size); } psi_img_del (simg); if (dimg == NULL) { return (1); } pri_img_del (*img); *img = dimg; return (0); }
int main (int argc, char **argv) { int r; char **optarg; pri_img_t *img; const char *out; arg0 = argv[0]; img = NULL; out = NULL; pri_mfm_init (&par_mfm, 500000, 300); while (1) { r = pce_getopt (argc, argv, &optarg, opts); if (r == GETOPT_DONE) { break; } if (r < 0) { return (1); } switch (r) { case '?': print_help(); return (0); case 'V': print_version(); return (0); case 'c': if (pri_parse_range (optarg[0], &par_cyl[0], &par_cyl[1], &par_cyl_all)) { return (1); } break; case 'e': if (img != NULL) { if (pri_edit_tracks (img, optarg[0], optarg[1])) { return (1); } } break; case 'f': if (img != NULL) { pri_print_info (img); } else { par_print_info = 1; } break; case 'h': if (pri_parse_range (optarg[0], &par_trk[0], &par_trk[1], &par_trk_all)) { return (1); } break; case 'i': if (img != NULL) { pri_img_del (img); } img = pri_load_image (optarg[0]); if (img == NULL) { return (1); } break; case 'I': if (pri_set_format (optarg[0], &par_fmt_inp)) { return (1); } break; case 'l': if (img != NULL) { pri_list_tracks (img); } else { par_list = 1; } break; case 'o': out = optarg[0]; break; case 'O': if (pri_set_format (optarg[0], &par_fmt_out)) { return (1); } break; case 'p': if (pri_operation (&img, optarg[0], argc, argv)) { return (1); } break; case 'r': par_data_rate = strtoul (optarg[0], NULL, 0); if (par_data_rate <= 1000) { par_data_rate *= 1000; } break; case 's': if (pri_set_parameter (optarg[0], optarg[1])) { return (1); } break; case 't': if (pri_parse_range (optarg[0], &par_cyl[0], &par_cyl[1], &par_cyl_all)) { return (1); } if (pri_parse_range (optarg[1], &par_trk[0], &par_trk[1], &par_trk_all)) { return (1); } break; case 'v': par_verbose = 1; break; case 0: if (img == NULL) { img = pri_load_image (optarg[0]); if (img == NULL) { return (1); } } else if (out == NULL) { out = optarg[0]; } else { fprintf (stderr, "%s: unknown option (%s)\n", arg0, optarg[0] ); return (1); } break; default: return (1); } } if (out != NULL) { if (img == NULL) { img = pri_img_new(); } if (img == NULL) { return (1); } if (par_verbose) { fprintf (stderr, "%s: save image to %s\n", arg0, out); } r = pri_img_save (out, img, par_fmt_out); if (r) { fprintf (stderr, "%s: saving failed (%s)\n", argv[0], out ); return (1); } } return (0); }