From 6b3bff56b307380c49427ed845530207992b0047 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 21 May 2019 15:38:39 -0700 Subject: [PATCH] DISK: Add support to properly autosize fixed sized disk from a set of choices As discussed in #704 --- PDP11/pdp11_hk.c | 8 +++++--- PDP11/pdp11_rl.c | 8 +++++--- PDP11/pdp11_rp.c | 7 ++++--- doc/simh.doc | Bin 284672 -> 285184 bytes scp.c | 1 + sim_defs.h | 3 ++- sim_disk.c | 44 ++++++++++++++++++++++++++++++++++---------- sim_disk.h | 2 ++ 8 files changed, 53 insertions(+), 20 deletions(-) diff --git a/PDP11/pdp11_hk.c b/PDP11/pdp11_hk.c index 7c9686e5..72c74a6f 100644 --- a/PDP11/pdp11_hk.c +++ b/PDP11/pdp11_hk.c @@ -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 */ diff --git a/PDP11/pdp11_rl.c b/PDP11/pdp11_rl.c index e78df7c1..fb0f522b 100644 --- a/PDP11/pdp11_rl.c +++ b/PDP11/pdp11_rl.c @@ -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; /* diff --git a/PDP11/pdp11_rp.c b/PDP11/pdp11_rp.c index f1753726..b8a74286 100644 --- a/PDP11/pdp11_rp.c +++ b/PDP11/pdp11_rp.c @@ -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 */ diff --git a/doc/simh.doc b/doc/simh.doc index 27e177f38a9e5bdfecc8d7967bae242695c778ea..9cd375c495c98a2691d969e410f76be696d7c639 100644 GIT binary patch delta 10793 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 P96ZP|*njr~se%3v20wGA diff --git a/scp.c b/scp.c index f86ba86a..7781648a 100644 --- a/scp.c +++ b/scp.c @@ -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), diff --git a/sim_defs.h b/sim_defs.h index 21f0e431..29666336 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -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 */ diff --git a/sim_disk.c b/sim_disk.c index 48618ffb..d75220b5 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -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, §s_read, 1024 / ctx->sector_size) || + if ((sim_disk_rdsect(uptr, (base + dir_sec) * (512 / ctx->sector_size), sector_buf, §s_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)))) { diff --git a/sim_disk.h b/sim_disk.h index a6fff7b1..6d11c083 100644 --- a/sim_disk.h +++ b/sim_disk.h @@ -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);