3B2: Properly set drive type for IDISK device disks

As reported in #847
This commit is contained in:
Mark Pizzolato 2020-05-02 10:32:05 -07:00
parent 494e68fcbf
commit c76086bc00
2 changed files with 23 additions and 4 deletions

View file

@ -114,6 +114,7 @@ int8 id_seek_state[ID_NUM_UNITS] = {ID_SEEK_NONE};
struct id_dtype { struct id_dtype {
uint8 hd; /* Number of heads */ uint8 hd; /* Number of heads */
uint32 capac; /* Capacity (in sectors) */ uint32 capac; /* Capacity (in sectors) */
const char *name;
}; };
static struct id_dtype id_dtab[] = { static struct id_dtype id_dtab[] = {
@ -126,9 +127,9 @@ static struct id_dtype id_dtab[] = {
}; };
UNIT id_unit[] = { 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 }, (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 }, (ID_HD72_DTYPE << ID_V_DTYPE), ID_DSK_SIZE(HD72)), 0, ID1, 0 },
{ UDATA (&id_ctlr_svc, 0, 0) }, { UDATA (&id_ctlr_svc, 0, 0) },
{ NULL } { NULL }
@ -161,6 +162,12 @@ MTAB id_mod[] = {
&id_set_type, NULL, NULL, "Set HD135 Disk Type" }, &id_set_type, NULL, NULL, "Set HD135 Disk Type" },
{ MTAB_XTD|MTAB_VUN, ID_HD161_DTYPE, NULL, "HD161", { MTAB_XTD|MTAB_VUN, ID_HD161_DTYPE, NULL, "HD161",
&id_set_type, NULL, NULL, "Set HD161 Disk Type" }, &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 } { 0 }
}; };
@ -353,6 +360,12 @@ t_stat id_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc)
return SCPE_OK; 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) t_stat id_reset(DEVICE *dptr)
{ {
id_clear_fifo(); id_clear_fifo();
@ -361,7 +374,10 @@ t_stat id_reset(DEVICE *dptr)
t_stat id_attach(UNIT *uptr, CONST char *cptr) 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) t_stat id_detach(UNIT *uptr)

View file

@ -139,8 +139,10 @@
#define ID_V_DTYPE (DKUF_V_UF + 0) #define ID_V_DTYPE (DKUF_V_UF + 0)
#define ID_M_DTYPE 3 #define ID_M_DTYPE 3
#define ID_DTYPE (ID_M_DTYPE << ID_V_DTYPE) #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_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 #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_unit_svc(UNIT *uptr);
t_stat id_reset(DEVICE *dptr); t_stat id_reset(DEVICE *dptr);
t_stat id_set_type(UNIT *uptr, int32 val, CONST char *cptr, void *desc); 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_attach(UNIT *uptr, CONST char *cptr);
t_stat id_detach(UNIT *uptr); t_stat id_detach(UNIT *uptr);
uint32 id_read(uint32 pa, size_t size); uint32 id_read(uint32 pa, size_t size);