示例#1
0
文件: fdc.c 项目: LasDesu/pce
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);
}
示例#2
0
文件: fdc.c 项目: LasDesu/pce
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);
}
示例#3
0
文件: main.c 项目: arunsirrpi/pce
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);
}
示例#4
0
文件: main.c 项目: arunsirrpi/pce
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);
}