DISK: Add support to properly autosize fixed sized disk from a set of choices

As discussed in #704
This commit is contained in:
Mark Pizzolato 2019-05-21 15:38:39 -07:00
parent 4f2dc069ae
commit 6b3bff56b3
8 changed files with 53 additions and 20 deletions

View file

@ -1497,11 +1497,13 @@ uint32 drv;
t_offset p;
t_stat r;
int32 old_hkds;
static const char *drives[] = {"RK06", "RK07", NULL};
uptr->capac = HK_SIZE (uptr);
r = sim_disk_attach (uptr, cptr, HK_NUMWD * sizeof (uint16),
sizeof (uint16), TRUE, 0,
(uptr->capac == RK06_SIZE) ? "RK06" : "RK07", HK_NUMSC, 0);
r = sim_disk_attach_ex (uptr, cptr, HK_NUMWD * sizeof (uint16),
sizeof (uint16), TRUE, 0,
(uptr->capac == RK06_SIZE) ? "RK06" : "RK07", HK_NUMSC, 0,
(uptr->flags & UNIT_AUTO) ? drives : NULL);
if (r != SCPE_OK) /* error? */
return r;
drv = (uint32) (uptr - hk_dev.units); /* get drv number */

View file

@ -1017,11 +1017,13 @@ t_stat rl_attach (UNIT *uptr, CONST char *cptr)
{
t_offset p;
t_stat r;
static const char *drives[] = {"RL01", "RL02", NULL};
uptr->capac = (uptr->flags & UNIT_RL02)? RL02_SIZE: RL01_SIZE;
r = sim_disk_attach (uptr, cptr, RL_NUMWD * sizeof (uint16),
sizeof (uint16), TRUE, 0,
(uptr->capac == RL02_SIZE) ? "RL02" : "RL01", RL_NUMSC, 0);
r = sim_disk_attach_ex (uptr, cptr, RL_NUMWD * sizeof (uint16),
sizeof (uint16), TRUE, 0,
(uptr->capac == RL02_SIZE) ? "RL02" : "RL01", RL_NUMSC, 0,
(uptr->flags & UNIT_AUTO) ? drives : NULL);
if (r != SCPE_OK) /* error? */
return r;
/*

View file

@ -1378,11 +1378,12 @@ t_stat rp_attach (UNIT *uptr, CONST char *cptr)
int32 drv, i, p;
t_stat r;
DEVICE *dptr = find_dev_from_unit (uptr);
static const char *drives[] = {"RM03", "RP04", "RM80", "RP06", "RM05", "RP07", NULL};
uptr->capac = drv_tab[GET_DTYPE (uptr->flags)].size;
r = sim_disk_attach (uptr, cptr, RP_NUMWD * sizeof (uint16),
sizeof (uint16), TRUE, 0,
drv_tab[GET_DTYPE (uptr->flags)].name, drv_tab[GET_DTYPE (uptr->flags)].sect, 0);
r = sim_disk_attach_ex (uptr, cptr, RP_NUMWD * sizeof (uint16),
sizeof (uint16), TRUE, 0,
drv_tab[GET_DTYPE (uptr->flags)].name, drv_tab[GET_DTYPE (uptr->flags)].sect, 0, (uptr->flags & UNIT_AUTO) ? drives : NULL);
if (r != SCPE_OK) /* error? */
return r;
drv = (int32) (uptr - dptr->units); /* get drv number */

Binary file not shown.

1
scp.c
View file

@ -759,6 +759,7 @@ const struct scp_error {
{"REMOTE", "remote console command"},
{"INVEXPR", "invalid expression"},
{"SIGTERM", "SIGTERM received"},
{"FSSIZE", "File System size larger than disk size"},
};
const size_t size_map[] = { sizeof (int8),

View file

@ -416,8 +416,9 @@ typedef uint32 t_addr;
#define SCPE_REMOTE (SCPE_BASE + 46) /* remote console command */
#define SCPE_INVEXPR (SCPE_BASE + 47) /* invalid expression */
#define SCPE_SIGTERM (SCPE_BASE + 48) /* SIGTERM has been received */
#define SCPE_FSSIZE (SCPE_BASE + 49) /* File System size larger than disk size */
#define SCPE_MAX_ERR (SCPE_BASE + 48) /* Maximum SCPE Error Value */
#define SCPE_MAX_ERR (SCPE_BASE + 49) /* Maximum SCPE Error Value */
#define SCPE_KFLAG 0x10000000 /* tti data flag */
#define SCPE_BREAK 0x20000000 /* tti break flag */
#define SCPE_NOMESSAGE 0x40000000 /* message display supression flag */

View file

@ -1444,7 +1444,7 @@ for (part = 0; part < RT11_MAXPARTITIONS; part++) {
dir_sec = Home.hb_w_firstdir + ((dir_seg - 1) * 2);
if (sim_disk_rdsect(uptr, (base + dir_sec) * (512 / ctx->sector_size), sector_buf, &sects_read, 1024 / ctx->sector_size) ||
if ((sim_disk_rdsect(uptr, (base + dir_sec) * (512 / ctx->sector_size), sector_buf, &sects_read, 1024 / ctx->sector_size)) ||
(sects_read != (1024 / ctx->sector_size)))
goto Return_Cleanup;
@ -1545,6 +1545,12 @@ return ret_val;
t_stat sim_disk_attach (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontautosize,
uint32 dbit, const char *dtype, uint32 pdp11tracksize, int completion_delay)
{
return sim_disk_attach_ex (uptr, cptr, sector_size, xfer_element_size, dontautosize, dbit, dtype, pdp11tracksize, completion_delay, NULL);
}
t_stat sim_disk_attach_ex (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontautosize,
uint32 dbit, const char *dtype, uint32 pdp11tracksize, int completion_delay, const char **drivetypes)
{
struct disk_context *ctx;
DEVICE *dptr;
char tbuf[4*CBUFSIZE];
@ -1976,16 +1982,34 @@ if (container_size && (container_size != (t_offset)-1)) {
if (dontautosize) {
t_addr saved_capac = uptr->capac;
if ((filesystem_size != (t_offset)-1) &&
(filesystem_size > current_unit_size)) {
if (!sim_quiet) {
uptr->capac = (t_addr)(filesystem_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)));
sim_printf ("%s%d: The file system on the disk %s is larger than simulated device (%s > ", sim_dname (dptr), (int)(uptr-dptr->units), cptr, sprint_capac (dptr, uptr));
uptr->capac = saved_capac;
sim_printf ("%s)\n", sprint_capac (dptr, uptr));
if (filesystem_size != (t_offset)-1) {
const char *drive_type = NULL;
while ((filesystem_size > current_unit_size) &&
((drivetypes ? *drivetypes : NULL) != NULL)) {
char cmd[CBUFSIZE];
t_stat st;
uptr->flags &= ~UNIT_ATT; /* temporarily mark as un-attached */
drive_type = *drivetypes;
sprintf (cmd, "%s %s", sim_uname (uptr), *drivetypes);
st = set_cmd (0, cmd);
uptr->flags |= UNIT_ATT; /* restore attached indicator */
if (st == SCPE_OK) {
current_unit_size = ((t_offset)uptr->capac)*ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1);
++drivetypes; /* next type */
}
}
if (filesystem_size > current_unit_size) {
if (!sim_quiet) {
uptr->capac = (t_addr)(filesystem_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)));
sim_printf ("%s%d: The file system on the disk %s is larger than simulated device (%s > ", sim_dname (dptr), (int)(uptr-dptr->units), cptr, sprint_capac (dptr, uptr));
uptr->capac = saved_capac;
sim_printf ("%s)\n", sprint_capac (dptr, uptr));
}
sim_disk_detach (uptr);
return SCPE_FSSIZE;
}
sim_disk_detach (uptr);
return SCPE_OPENERR;
}
if ((container_size < current_unit_size) &&
((DKUF_F_VHD == DK_GET_FMT (uptr)) || (0 != (uptr->flags & UNIT_RO)))) {

View file

@ -70,6 +70,8 @@ typedef void (*DISK_PCALLBACK)(UNIT *unit, t_stat status);
t_stat sim_disk_attach (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontautosize,
uint32 debugbit, const char *drivetype, uint32 pdp11_tracksize, int completion_delay);
t_stat sim_disk_attach_ex (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontautosize,
uint32 dbit, const char *dtype, uint32 pdp11tracksize, int completion_delay, const char **drivetypes);
t_stat sim_disk_detach (UNIT *uptr);
t_stat sim_disk_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
t_stat sim_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects);