DISK: Add explicit AUTO detect disk format mode
This commit is contained in:
parent
d356274d38
commit
6667f651a3
2 changed files with 38 additions and 34 deletions
44
sim_disk.c
44
sim_disk.c
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue