DISK: Add support to properly autosize fixed sized disk from a set of choices
As discussed in #704
This commit is contained in:
parent
4f2dc069ae
commit
6b3bff56b3
8 changed files with 53 additions and 20 deletions
|
@ -1497,11 +1497,13 @@ uint32 drv;
|
||||||
t_offset p;
|
t_offset p;
|
||||||
t_stat r;
|
t_stat r;
|
||||||
int32 old_hkds;
|
int32 old_hkds;
|
||||||
|
static const char *drives[] = {"RK06", "RK07", NULL};
|
||||||
|
|
||||||
uptr->capac = HK_SIZE (uptr);
|
uptr->capac = HK_SIZE (uptr);
|
||||||
r = sim_disk_attach (uptr, cptr, HK_NUMWD * sizeof (uint16),
|
r = sim_disk_attach_ex (uptr, cptr, HK_NUMWD * sizeof (uint16),
|
||||||
sizeof (uint16), TRUE, 0,
|
sizeof (uint16), TRUE, 0,
|
||||||
(uptr->capac == RK06_SIZE) ? "RK06" : "RK07", HK_NUMSC, 0);
|
(uptr->capac == RK06_SIZE) ? "RK06" : "RK07", HK_NUMSC, 0,
|
||||||
|
(uptr->flags & UNIT_AUTO) ? drives : NULL);
|
||||||
if (r != SCPE_OK) /* error? */
|
if (r != SCPE_OK) /* error? */
|
||||||
return r;
|
return r;
|
||||||
drv = (uint32) (uptr - hk_dev.units); /* get drv number */
|
drv = (uint32) (uptr - hk_dev.units); /* get drv number */
|
||||||
|
|
|
@ -1017,11 +1017,13 @@ t_stat rl_attach (UNIT *uptr, CONST char *cptr)
|
||||||
{
|
{
|
||||||
t_offset p;
|
t_offset p;
|
||||||
t_stat r;
|
t_stat r;
|
||||||
|
static const char *drives[] = {"RL01", "RL02", NULL};
|
||||||
|
|
||||||
uptr->capac = (uptr->flags & UNIT_RL02)? RL02_SIZE: RL01_SIZE;
|
uptr->capac = (uptr->flags & UNIT_RL02)? RL02_SIZE: RL01_SIZE;
|
||||||
r = sim_disk_attach (uptr, cptr, RL_NUMWD * sizeof (uint16),
|
r = sim_disk_attach_ex (uptr, cptr, RL_NUMWD * sizeof (uint16),
|
||||||
sizeof (uint16), TRUE, 0,
|
sizeof (uint16), TRUE, 0,
|
||||||
(uptr->capac == RL02_SIZE) ? "RL02" : "RL01", RL_NUMSC, 0);
|
(uptr->capac == RL02_SIZE) ? "RL02" : "RL01", RL_NUMSC, 0,
|
||||||
|
(uptr->flags & UNIT_AUTO) ? drives : NULL);
|
||||||
if (r != SCPE_OK) /* error? */
|
if (r != SCPE_OK) /* error? */
|
||||||
return r;
|
return r;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1378,11 +1378,12 @@ t_stat rp_attach (UNIT *uptr, CONST char *cptr)
|
||||||
int32 drv, i, p;
|
int32 drv, i, p;
|
||||||
t_stat r;
|
t_stat r;
|
||||||
DEVICE *dptr = find_dev_from_unit (uptr);
|
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;
|
uptr->capac = drv_tab[GET_DTYPE (uptr->flags)].size;
|
||||||
r = sim_disk_attach (uptr, cptr, RP_NUMWD * sizeof (uint16),
|
r = sim_disk_attach_ex (uptr, cptr, RP_NUMWD * sizeof (uint16),
|
||||||
sizeof (uint16), TRUE, 0,
|
sizeof (uint16), TRUE, 0,
|
||||||
drv_tab[GET_DTYPE (uptr->flags)].name, drv_tab[GET_DTYPE (uptr->flags)].sect, 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? */
|
if (r != SCPE_OK) /* error? */
|
||||||
return r;
|
return r;
|
||||||
drv = (int32) (uptr - dptr->units); /* get drv number */
|
drv = (int32) (uptr - dptr->units); /* get drv number */
|
||||||
|
|
BIN
doc/simh.doc
BIN
doc/simh.doc
Binary file not shown.
1
scp.c
1
scp.c
|
@ -759,6 +759,7 @@ const struct scp_error {
|
||||||
{"REMOTE", "remote console command"},
|
{"REMOTE", "remote console command"},
|
||||||
{"INVEXPR", "invalid expression"},
|
{"INVEXPR", "invalid expression"},
|
||||||
{"SIGTERM", "SIGTERM received"},
|
{"SIGTERM", "SIGTERM received"},
|
||||||
|
{"FSSIZE", "File System size larger than disk size"},
|
||||||
};
|
};
|
||||||
|
|
||||||
const size_t size_map[] = { sizeof (int8),
|
const size_t size_map[] = { sizeof (int8),
|
||||||
|
|
|
@ -416,8 +416,9 @@ typedef uint32 t_addr;
|
||||||
#define SCPE_REMOTE (SCPE_BASE + 46) /* remote console command */
|
#define SCPE_REMOTE (SCPE_BASE + 46) /* remote console command */
|
||||||
#define SCPE_INVEXPR (SCPE_BASE + 47) /* invalid expression */
|
#define SCPE_INVEXPR (SCPE_BASE + 47) /* invalid expression */
|
||||||
#define SCPE_SIGTERM (SCPE_BASE + 48) /* SIGTERM has been received */
|
#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_KFLAG 0x10000000 /* tti data flag */
|
||||||
#define SCPE_BREAK 0x20000000 /* tti break flag */
|
#define SCPE_BREAK 0x20000000 /* tti break flag */
|
||||||
#define SCPE_NOMESSAGE 0x40000000 /* message display supression flag */
|
#define SCPE_NOMESSAGE 0x40000000 /* message display supression flag */
|
||||||
|
|
32
sim_disk.c
32
sim_disk.c
|
@ -1444,7 +1444,7 @@ for (part = 0; part < RT11_MAXPARTITIONS; part++) {
|
||||||
|
|
||||||
dir_sec = Home.hb_w_firstdir + ((dir_seg - 1) * 2);
|
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)))
|
(sects_read != (1024 / ctx->sector_size)))
|
||||||
goto Return_Cleanup;
|
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,
|
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)
|
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;
|
struct disk_context *ctx;
|
||||||
DEVICE *dptr;
|
DEVICE *dptr;
|
||||||
char tbuf[4*CBUFSIZE];
|
char tbuf[4*CBUFSIZE];
|
||||||
|
@ -1976,8 +1982,25 @@ if (container_size && (container_size != (t_offset)-1)) {
|
||||||
if (dontautosize) {
|
if (dontautosize) {
|
||||||
t_addr saved_capac = uptr->capac;
|
t_addr saved_capac = uptr->capac;
|
||||||
|
|
||||||
if ((filesystem_size != (t_offset)-1) &&
|
if (filesystem_size != (t_offset)-1) {
|
||||||
(filesystem_size > current_unit_size)) {
|
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) {
|
if (!sim_quiet) {
|
||||||
uptr->capac = (t_addr)(filesystem_size/(ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)));
|
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));
|
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));
|
||||||
|
@ -1985,7 +2008,8 @@ if (container_size && (container_size != (t_offset)-1)) {
|
||||||
sim_printf ("%s)\n", sprint_capac (dptr, uptr));
|
sim_printf ("%s)\n", sprint_capac (dptr, uptr));
|
||||||
}
|
}
|
||||||
sim_disk_detach (uptr);
|
sim_disk_detach (uptr);
|
||||||
return SCPE_OPENERR;
|
return SCPE_FSSIZE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ((container_size < current_unit_size) &&
|
if ((container_size < current_unit_size) &&
|
||||||
((DKUF_F_VHD == DK_GET_FMT (uptr)) || (0 != (uptr->flags & UNIT_RO)))) {
|
((DKUF_F_VHD == DK_GET_FMT (uptr)) || (0 != (uptr->flags & UNIT_RO)))) {
|
||||||
|
|
|
@ -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,
|
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);
|
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_detach (UNIT *uptr);
|
||||||
t_stat sim_disk_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
|
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);
|
t_stat sim_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects);
|
||||||
|
|
Loading…
Add table
Reference in a new issue