DISK: Add explicit AUTO detect disk format mode

This commit is contained in:
Mark Pizzolato 2018-04-10 11:43:43 -07:00
parent d356274d38
commit 6667f651a3
2 changed files with 38 additions and 34 deletions

View file

@ -296,7 +296,8 @@ struct sim_disk_fmt {
t_stat (*impl_fnc)(void); /* Implemented Test Function */
};
static struct sim_disk_fmt fmts[DKUF_N_FMT] = {
static struct sim_disk_fmt fmts[] = {
{ "AUTO", 0, DKUF_F_AUTO, NULL},
{ "SIMH", 0, DKUF_F_STD, NULL},
{ "RAW", 0, DKUF_F_RAW, sim_os_disk_implemented_raw},
{ "VHD", 0, DKUF_F_VHD, sim_vhd_disk_implemented},
@ -313,7 +314,7 @@ if (uptr == NULL)
return SCPE_IERR;
if (cptr == NULL)
return SCPE_ARG;
for (f = 0; f < DKUF_N_FMT && fmts[f].name; f++) {
for (f = 0; fmts[f].name; f++) {
if (fmts[f].name && (strcmp (cptr, fmts[f].name) == 0)) {
if ((fmts[f].impl_fnc) && (fmts[f].impl_fnc() != SCPE_OK))
return SCPE_NOFNC;
@ -322,7 +323,7 @@ for (f = 0; f < DKUF_N_FMT && fmts[f].name; f++) {
return SCPE_OK;
}
}
return SCPE_ARG;
return sim_messagef (SCPE_ARG, "Unknown disk format: %s\n", cptr);
}
/* Show disk format */
@ -332,7 +333,7 @@ t_stat sim_disk_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
int32 f = DK_GET_FMT (uptr);
size_t i;
for (i = 0; i < DKUF_N_FMT; i++)
for (i = 0; fmts[i].name; i++)
if (fmts[i].fmtval == f) {
fprintf (st, "%s format", fmts[i].name);
return SCPE_OK;
@ -1352,8 +1353,9 @@ if (sim_switches & SWMASK ('F')) { /* format spec? */
cptr = get_glyph (cptr, gbuf, 0); /* get spec */
if (*cptr == 0) /* must be more */
return SCPE_2FARG;
if (sim_disk_set_fmt (uptr, 0, gbuf, NULL) != SCPE_OK)
return sim_messagef (SCPE_ARG, "Invalid Disk Format: %s\n", gbuf);
if ((sim_disk_set_fmt (uptr, 0, gbuf, NULL) != SCPE_OK) ||
(DK_GET_FMT (uptr) == DKUF_F_AUTO))
return sim_messagef (SCPE_ARG, "Invalid Override Disk Format: %s\n", gbuf);
sim_switches = sim_switches & ~(SWMASK ('F')); /* Record Format specifier already processed */
auto_format = TRUE;
}
@ -1521,29 +1523,31 @@ else
}
switch (DK_GET_FMT (uptr)) { /* case on format */
case DKUF_F_STD: /* SIMH format */
if (NULL == (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { /* Try VHD */
if (errno == EBADF) /* VHD but broken */
return SCPE_OPENERR;
if (NULL == (uptr->fileref = sim_os_disk_open_raw (cptr, "rb"))) {
open_function = sim_fopen;
size_function = sim_fsize_ex;
case DKUF_F_AUTO: /* SIMH format */
auto_format = TRUE;
if (NULL != (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { /* Try VHD */
sim_disk_set_fmt (uptr, 0, "VHD", NULL); /* set file format to VHD */
sim_vhd_disk_close (uptr->fileref); /* close vhd file*/
uptr->fileref = NULL;
break;
}
if (NULL != (uptr->fileref = sim_os_disk_open_raw (cptr, "rb"))) {
sim_disk_set_fmt (uptr, 0, "RAW", NULL); /* set file format to RAW */
sim_os_disk_close_raw (uptr->fileref); /* close raw file*/
open_function = sim_os_disk_open_raw;
size_function = sim_os_disk_size_raw;
storage_function = sim_os_disk_info_raw;
auto_format = TRUE;
uptr->fileref = NULL;
break;
}
sim_disk_set_fmt (uptr, 0, "VHD", NULL); /* set file format to VHD */
sim_vhd_disk_close (uptr->fileref); /* close vhd file*/
auto_format = TRUE;
uptr->fileref = NULL;
/* Fall through to normal VHD processing */
sim_disk_set_fmt (uptr, 0, "SIMH", NULL); /* set file format to SIMH */
open_function = sim_fopen;
size_function = sim_fsize_ex;
break;
case DKUF_F_STD: /* SIMH format */
open_function = sim_fopen;
size_function = sim_fsize_ex;
break;
case DKUF_F_VHD: /* VHD format */
open_function = sim_vhd_disk_open;
create_function = sim_vhd_disk_create;
@ -1842,7 +1846,7 @@ free (uptr->disk_ctx);
uptr->disk_ctx = NULL;
uptr->io_flush = NULL;
if (auto_format)
sim_disk_set_fmt (uptr, 0, "SIMH", NULL); /* restore file format */
sim_disk_set_fmt (uptr, 0, "AUTO", NULL); /* restore file format */
if (close_function (fileref) == EOF)
return SCPE_IOERR;
return SCPE_OK;

View file

@ -44,11 +44,11 @@ typedef uint32 t_lba; /* disk logical block ad
#define DKUF_V_WLK (UNIT_V_UF + 0) /* write locked */
#define DKUF_V_FMT (UNIT_V_UF + 1) /* disk file format */
#define DKUF_W_FMT 2 /* 2b of formats */
#define DKUF_N_FMT (1u << DKUF_W_FMT) /* number of formats */
#define DKUF_M_FMT ((1u << DKUF_W_FMT) - 1)
#define DKUF_F_STD 0 /* SIMH format */
#define DKUF_F_RAW 1 /* Raw Physical Disk Access */
#define DKUF_F_VHD 2 /* VHD format */
#define DKUF_F_AUTO 0 /* Auto detect format format */
#define DKUF_F_STD 1 /* SIMH format */
#define DKUF_F_RAW 2 /* Raw Physical Disk Access */
#define DKUF_F_VHD 3 /* VHD format */
#define DKUF_V_UF (DKUF_V_FMT + DKUF_W_FMT)
#define DKUF_WLK (1u << DKUF_V_WLK)
#define DKUF_FMT (DKUF_M_FMT << DKUF_V_FMT)