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 */ 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}, { "SIMH", 0, DKUF_F_STD, NULL},
{ "RAW", 0, DKUF_F_RAW, sim_os_disk_implemented_raw}, { "RAW", 0, DKUF_F_RAW, sim_os_disk_implemented_raw},
{ "VHD", 0, DKUF_F_VHD, sim_vhd_disk_implemented}, { "VHD", 0, DKUF_F_VHD, sim_vhd_disk_implemented},
@ -313,7 +314,7 @@ if (uptr == NULL)
return SCPE_IERR; return SCPE_IERR;
if (cptr == NULL) if (cptr == NULL)
return SCPE_ARG; 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].name && (strcmp (cptr, fmts[f].name) == 0)) {
if ((fmts[f].impl_fnc) && (fmts[f].impl_fnc() != SCPE_OK)) if ((fmts[f].impl_fnc) && (fmts[f].impl_fnc() != SCPE_OK))
return SCPE_NOFNC; return SCPE_NOFNC;
@ -322,7 +323,7 @@ for (f = 0; f < DKUF_N_FMT && fmts[f].name; f++) {
return SCPE_OK; return SCPE_OK;
} }
} }
return SCPE_ARG; return sim_messagef (SCPE_ARG, "Unknown disk format: %s\n", cptr);
} }
/* Show disk format */ /* 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); int32 f = DK_GET_FMT (uptr);
size_t i; size_t i;
for (i = 0; i < DKUF_N_FMT; i++) for (i = 0; fmts[i].name; i++)
if (fmts[i].fmtval == f) { if (fmts[i].fmtval == f) {
fprintf (st, "%s format", fmts[i].name); fprintf (st, "%s format", fmts[i].name);
return SCPE_OK; return SCPE_OK;
@ -1352,8 +1353,9 @@ if (sim_switches & SWMASK ('F')) { /* format spec? */
cptr = get_glyph (cptr, gbuf, 0); /* get spec */ cptr = get_glyph (cptr, gbuf, 0); /* get spec */
if (*cptr == 0) /* must be more */ if (*cptr == 0) /* must be more */
return SCPE_2FARG; return SCPE_2FARG;
if (sim_disk_set_fmt (uptr, 0, gbuf, NULL) != SCPE_OK) if ((sim_disk_set_fmt (uptr, 0, gbuf, NULL) != SCPE_OK) ||
return sim_messagef (SCPE_ARG, "Invalid Disk Format: %s\n", gbuf); (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 */ sim_switches = sim_switches & ~(SWMASK ('F')); /* Record Format specifier already processed */
auto_format = TRUE; auto_format = TRUE;
} }
@ -1521,29 +1523,31 @@ else
} }
switch (DK_GET_FMT (uptr)) { /* case on format */ switch (DK_GET_FMT (uptr)) { /* case on format */
case DKUF_F_STD: /* SIMH format */ case DKUF_F_AUTO: /* SIMH format */
if (NULL == (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { /* Try VHD */ auto_format = TRUE;
if (errno == EBADF) /* VHD but broken */ if (NULL != (uptr->fileref = sim_vhd_disk_open (cptr, "rb"))) { /* Try VHD */
return SCPE_OPENERR; sim_disk_set_fmt (uptr, 0, "VHD", NULL); /* set file format to VHD */
if (NULL == (uptr->fileref = sim_os_disk_open_raw (cptr, "rb"))) { sim_vhd_disk_close (uptr->fileref); /* close vhd file*/
open_function = sim_fopen; uptr->fileref = NULL;
size_function = sim_fsize_ex;
break; 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_disk_set_fmt (uptr, 0, "RAW", NULL); /* set file format to RAW */
sim_os_disk_close_raw (uptr->fileref); /* close raw file*/ sim_os_disk_close_raw (uptr->fileref); /* close raw file*/
open_function = sim_os_disk_open_raw; open_function = sim_os_disk_open_raw;
size_function = sim_os_disk_size_raw; size_function = sim_os_disk_size_raw;
storage_function = sim_os_disk_info_raw; storage_function = sim_os_disk_info_raw;
auto_format = TRUE;
uptr->fileref = NULL; uptr->fileref = NULL;
break; break;
} }
sim_disk_set_fmt (uptr, 0, "VHD", NULL); /* set file format to VHD */ sim_disk_set_fmt (uptr, 0, "SIMH", NULL); /* set file format to SIMH */
sim_vhd_disk_close (uptr->fileref); /* close vhd file*/ open_function = sim_fopen;
auto_format = TRUE; size_function = sim_fsize_ex;
uptr->fileref = NULL; break;
/* Fall through to normal VHD processing */ case DKUF_F_STD: /* SIMH format */
open_function = sim_fopen;
size_function = sim_fsize_ex;
break;
case DKUF_F_VHD: /* VHD format */ case DKUF_F_VHD: /* VHD format */
open_function = sim_vhd_disk_open; open_function = sim_vhd_disk_open;
create_function = sim_vhd_disk_create; create_function = sim_vhd_disk_create;
@ -1842,7 +1846,7 @@ free (uptr->disk_ctx);
uptr->disk_ctx = NULL; uptr->disk_ctx = NULL;
uptr->io_flush = NULL; uptr->io_flush = NULL;
if (auto_format) 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) if (close_function (fileref) == EOF)
return SCPE_IOERR; return SCPE_IOERR;
return SCPE_OK; 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_WLK (UNIT_V_UF + 0) /* write locked */
#define DKUF_V_FMT (UNIT_V_UF + 1) /* disk file format */ #define DKUF_V_FMT (UNIT_V_UF + 1) /* disk file format */
#define DKUF_W_FMT 2 /* 2b of formats */ #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_M_FMT ((1u << DKUF_W_FMT) - 1)
#define DKUF_F_STD 0 /* SIMH format */ #define DKUF_F_AUTO 0 /* Auto detect format format */
#define DKUF_F_RAW 1 /* Raw Physical Disk Access */ #define DKUF_F_STD 1 /* SIMH format */
#define DKUF_F_VHD 2 /* VHD 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_V_UF (DKUF_V_FMT + DKUF_W_FMT)
#define DKUF_WLK (1u << DKUF_V_WLK) #define DKUF_WLK (1u << DKUF_V_WLK)
#define DKUF_FMT (DKUF_M_FMT << DKUF_V_FMT) #define DKUF_FMT (DKUF_M_FMT << DKUF_V_FMT)