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 27e177f3..9cd375c4 100644 Binary files a/doc/simh.doc and b/doc/simh.doc differ 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);