From c76086bc00e8b3c09b4db5a44a6a52e8378a00ea Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 2 May 2020 10:32:05 -0700 Subject: [PATCH] 3B2: Properly set drive type for IDISK device disks As reported in #847 --- 3B2/3b2_id.c | 22 +++++++++++++++++++--- 3B2/3b2_id.h | 5 ++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/3B2/3b2_id.c b/3B2/3b2_id.c index b56060d6..77d26f1f 100644 --- a/3B2/3b2_id.c +++ b/3B2/3b2_id.c @@ -114,6 +114,7 @@ int8 id_seek_state[ID_NUM_UNITS] = {ID_SEEK_NONE}; struct id_dtype { uint8 hd; /* Number of heads */ uint32 capac; /* Capacity (in sectors) */ + const char *name; }; static struct id_dtype id_dtab[] = { @@ -126,9 +127,9 @@ static struct id_dtype id_dtab[] = { }; UNIT id_unit[] = { - { UDATA (&id_unit_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_BINK+ + { UDATA (&id_unit_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_BINK+ID_AUTOSIZE+ (ID_HD72_DTYPE << ID_V_DTYPE), ID_DSK_SIZE(HD72)), 0, ID0, 0 }, - { UDATA (&id_unit_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_BINK+ + { UDATA (&id_unit_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_BINK+ID_AUTOSIZE+ (ID_HD72_DTYPE << ID_V_DTYPE), ID_DSK_SIZE(HD72)), 0, ID1, 0 }, { UDATA (&id_ctlr_svc, 0, 0) }, { NULL } @@ -161,6 +162,12 @@ MTAB id_mod[] = { &id_set_type, NULL, NULL, "Set HD135 Disk Type" }, { MTAB_XTD|MTAB_VUN, ID_HD161_DTYPE, NULL, "HD161", &id_set_type, NULL, NULL, "Set HD161 Disk Type" }, + { MTAB_XTD|MTAB_VUN, 0, "TYPE", NULL, + NULL, &id_show_type, NULL, "Display device type" }, + { ID_AUTOSIZE, ID_AUTOSIZE, "autosize", "AUTOSIZE", + NULL, NULL, NULL, "Set type based on file size at attach" }, + { ID_AUTOSIZE, 0, "noautosize", "NOAUTOSIZE", + NULL, NULL, NULL, "Disable disk autosize on attach" }, { 0 } }; @@ -353,6 +360,12 @@ t_stat id_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc) return SCPE_OK; } +t_stat id_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc) +{ + fprintf (st, "%s", id_dtab[ID_GET_DTYPE(uptr->flags)].name); + return SCPE_OK; +} + t_stat id_reset(DEVICE *dptr) { id_clear_fifo(); @@ -361,7 +374,10 @@ t_stat id_reset(DEVICE *dptr) t_stat id_attach(UNIT *uptr, CONST char *cptr) { - return sim_disk_attach(uptr, cptr, 512, 1, TRUE, 0, "HD72", 0, 0); + static const char *drives[] = {"HD30", "HD72", "HD72C", "HD135", "HD161", NULL}; + + return sim_disk_attach_ex(uptr, cptr, 512, 1, TRUE, 0, id_dtab[ID_GET_DTYPE(uptr->flags)].name, + 0, 0, (uptr->flags & ID_AUTOSIZE) ? drives : NULL); } t_stat id_detach(UNIT *uptr) diff --git a/3B2/3b2_id.h b/3B2/3b2_id.h index 384e928f..589c4ab5 100644 --- a/3B2/3b2_id.h +++ b/3B2/3b2_id.h @@ -139,8 +139,10 @@ #define ID_V_DTYPE (DKUF_V_UF + 0) #define ID_M_DTYPE 3 #define ID_DTYPE (ID_M_DTYPE << ID_V_DTYPE) +#define ID_V_AUTOSIZE (ID_V_DTYPE + 2) +#define ID_AUTOSIZE (1 << ID_V_AUTOSIZE) #define ID_GET_DTYPE(x) (((x) >> ID_V_DTYPE) & ID_M_DTYPE) -#define ID_DRV(d) { ID_##d##_HEADS, ID_##d##_LBN } +#define ID_DRV(d) { ID_##d##_HEADS, ID_##d##_LBN, #d } #define ID_DSK_SIZE(d) ID_##d##_LBN @@ -162,6 +164,7 @@ t_stat id_ctlr_svc(UNIT *uptr); t_stat id_unit_svc(UNIT *uptr); t_stat id_reset(DEVICE *dptr); t_stat id_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat id_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat id_attach(UNIT *uptr, CONST char *cptr); t_stat id_detach(UNIT *uptr); uint32 id_read(uint32 pa, size_t size);