From c3e306d2c352a2be2bd855ff644d5f6a37d45a83 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 6 Nov 2022 13:07:05 -1000 Subject: [PATCH] DISK: Better support for SCSI device changing between disk<->tape device types - Produce reasonable SHOW output for each respective type - Changing a device disk<->tape sets disk and tape format to default values - Don't allow disk oriented modes to be set for tapes (autosize, autozap --- sim_disk.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/sim_disk.c b/sim_disk.c index d8abc8d2..c607afce 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -639,6 +639,10 @@ t_stat sim_disk_set_autosize (UNIT *uptr, int32 val, CONST char *cptr, void *des { if (uptr == NULL) return SCPE_IERR; +if ((uptr->drvtyp != NULL) && + (DRVFL_GET_IFTYPE(uptr->drvtyp) == DRVFL_TYPE_SCSI) && + (uptr->drvtyp->devtype == SCSI_TAPE)) + return sim_messagef (SCPE_NOFNC, "%s: Autosizing Tapes is not supported\n", sim_uname (uptr)); if (cptr != NULL) return sim_messagef (SCPE_ARG, "%s: Unexpected autosize argument: %s\n", sim_uname (uptr), cptr); if ((uptr->flags & UNIT_ATT) != 0) @@ -656,6 +660,10 @@ return SCPE_OK; t_stat sim_disk_show_autosize (FILE *st, UNIT *uptr, int32 val, CONST void *desc) { +if ((uptr->drvtyp != NULL) && + (DRVFL_GET_IFTYPE(uptr->drvtyp) == DRVFL_TYPE_SCSI) && + (uptr->drvtyp->devtype == SCSI_TAPE)) + return SCPE_NOFNC; fprintf (st, "%sautosize", ((uptr->flags & DKUF_NOAUTOSIZE) != 0) ? "no" : ""); return SCPE_OK; } @@ -707,6 +715,10 @@ t_stat sim_disk_set_autozap (UNIT *uptr, int32 val, CONST char *cptr, void *desc { if (uptr == NULL) return SCPE_IERR; +if ((uptr->drvtyp != NULL) && + (DRVFL_GET_IFTYPE(uptr->drvtyp) == DRVFL_TYPE_SCSI) && + (uptr->drvtyp->devtype == SCSI_TAPE)) + return sim_messagef (SCPE_NOFNC, "%s: Autozapping Tapes is not supported\n", sim_uname (uptr)); if (cptr != NULL) return sim_messagef (SCPE_ARG, "%s: Unexpected autozap argument: %s\n", sim_uname (uptr), cptr); if (val ^ ((uptr->flags & DKUF_AUTOZAP) == 0)) @@ -722,6 +734,10 @@ return SCPE_OK; t_stat sim_disk_show_autozap (FILE *st, UNIT *uptr, int32 val, CONST void *desc) { +if ((uptr->drvtyp != NULL) && + (DRVFL_GET_IFTYPE(uptr->drvtyp) == DRVFL_TYPE_SCSI) && + (uptr->drvtyp->devtype == SCSI_TAPE)) + return SCPE_NOFNC; fprintf (st, "%sautozap", ((uptr->flags & DKUF_AUTOZAP) != 0) ? "" : "no" ); return SCPE_OK; } @@ -7725,6 +7741,12 @@ if (cptr) { if ((r != SCPE_OK) || (cap < DRV_MINC) || (cap > max)) return sim_messagef (SCPE_ARG, "%s: Unreasonable capacity: %u\n", sim_uname (uptr), cap); } +if ((uptr->drvtyp != NULL) && + (DRVFL_GET_IFTYPE(uptr->drvtyp) == DRVFL_TYPE_SCSI) && + (uptr->drvtyp->devtype != drives[val].devtype)) { + sim_tape_set_fmt (uptr, 0, "SIMH", NULL); + sim_disk_set_fmt (uptr, 0, "AUTO", NULL); + } uptr->drvtyp = &drives[val]; set_writelock (uptr, ((uptr->drvtyp->flags & DRVFL_RO) != 0), NULL, NULL); if ((dptr->flags & DEV_SECTORS) == 0)