diff --git a/PDP11/pdp11_hk.c b/PDP11/pdp11_hk.c index 72c74a6f..52cb9c30 100644 --- a/PDP11/pdp11_hk.c +++ b/PDP11/pdp11_hk.c @@ -82,6 +82,20 @@ extern uint32 cpu_opt; #define HK_CYL(x) (((x)->flags & UNIT_DTYPE)? HK_NUMCY7: HK_NUMCY6) #define HK_MAXFR (1 << 16) +struct drvtyp { + int32 sect; /* sectors */ + int32 surf; /* surfaces */ + int32 cyl; /* cylinders */ + int32 size; /* #blocks */ + const char *name; /* device type name */ + }; + +static struct drvtyp drv_tab[] = { + { HK_NUMSC, HK_NUMSF, HK_NUMCY6, RK06_SIZE, "RK06" }, + { HK_NUMSC, HK_NUMSF, HK_NUMCY7, RK07_SIZE, "RK07" }, + { 0 } + }; + /* Flags in the unit flags word */ #define UNIT_V_WLK (UNIT_V_UF + 0) /* write locked */ @@ -95,6 +109,7 @@ extern uint32 cpu_opt; #define UNIT_AUTO (1 << UNIT_V_AUTO) #define UNIT_DUMMY (1 << UNIT_V_DUMMY) #define UNIT_WPRT (UNIT_WLK | UNIT_RO) /* write prot */ +#define GET_DTYPE(x) (((x) >> UNIT_V_DTYPE) & 1) /* Parameters in the unit descriptor */ @@ -569,7 +584,8 @@ void update_hkcs (int32 flags, int32 drv); void update_hkds (int32 drv); void hk_err (int32 cs1e, int32 cs2e, int32 drve, int32 drv); void hk_go (int32 drv); -t_stat hk_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat hk_set_type (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat hk_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat hk_set_bad (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat hk_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); const char *hk_description (DEVICE *dptr); @@ -654,23 +670,18 @@ MTAB hk_mod[] = { NULL, NULL, NULL, "Write lock disk drive" }, { UNIT_DUMMY, 0, NULL, "BADBLOCK", &hk_set_bad, NULL, NULL, "write bad block table on last track" }, + { MTAB_XTD|MTAB_VUN, 0, NULL, "RK06", + &hk_set_type, NULL, NULL, "Set RK06 Disk Type" }, + { MTAB_XTD|MTAB_VUN, 1, NULL, "RK07", + &hk_set_type, NULL, NULL, "Set RK07 Disk Type" }, + { MTAB_XTD|MTAB_VUN, 0, "TYPE", NULL, + NULL, &hk_show_type, NULL, "Display device type" }, + { UNIT_AUTO, UNIT_AUTO, "autosize", "AUTOSIZE", + NULL, NULL, NULL, "Set type based on file size at attach" }, + { UNIT_AUTO, 0, "noautosize", "NOAUTOSIZE", + NULL, NULL, NULL, "Disable disk autosize on attach" }, { MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "FORMAT", "FORMAT={SIMH|VHD|RAW}", - &sim_disk_set_fmt, &sim_disk_show_fmt, NULL, "Display disk format" }, - { (UNIT_DTYPE+UNIT_ATT), UNIT_RK06 + UNIT_ATT, - "RK06", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), UNIT_RK07 + UNIT_ATT, - "RK07", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), UNIT_RK06, - "RK06", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), UNIT_RK07, - "RK07", NULL, NULL }, - { (UNIT_AUTO+UNIT_ATT), UNIT_AUTO, "autosize", NULL}, - { UNIT_AUTO, UNIT_AUTO, NULL, "AUTOSIZE", - NULL, NULL, NULL, "set type based on file size at ATTACH" }, - { (UNIT_AUTO+UNIT_DTYPE), UNIT_RK06, NULL, "RK06", - &hk_set_size, NULL, NULL, "Set type to RK06" }, - { (UNIT_AUTO+UNIT_DTYPE), UNIT_RK07, NULL, "RK07", - &hk_set_size, NULL, NULL, "Set type to RK07" }, + &sim_disk_set_fmt, &sim_disk_show_fmt, NULL, "Set/Display disk format" }, { MTAB_XTD|MTAB_VDV|MTAB_VALR, 0040, "ADDRESS", "ADDRESS", &set_addr, &show_addr, NULL, "Bus address" }, { MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "VECTOR", "VECTOR", @@ -1494,7 +1505,6 @@ return auto_config (0, 0); t_stat hk_attach (UNIT *uptr, CONST char *cptr) { uint32 drv; -t_offset p; t_stat r; int32 old_hkds; static const char *drives[] = {"RK06", "RK07", NULL}; @@ -1517,18 +1527,6 @@ hk_dif[drv] = 0; uptr->CYL = 0; if ((old_hkds & DS_ATA) == 0) /* ATN transition? */ update_hkcs (CS1_DI, drv); /* upd ctlr status */ - -p = sim_disk_size (uptr); /* get file size */ -if ((uptr->flags & UNIT_AUTO) == 0) /* autosize? */ - return SCPE_OK; -if (p > (RK06_SIZE * sizeof (uint16))) { - uptr->flags = uptr->flags | UNIT_RK07; - uptr->capac = RK07_SIZE; - } -else { - uptr->flags = uptr->flags & ~UNIT_RK07; - uptr->capac = RK06_SIZE; - } return SCPE_OK; } @@ -1555,13 +1553,26 @@ if ((old_hkds & DS_ATA) == 0) /* ATN transition? */ return sim_disk_detach (uptr); } -/* Set size command validation routine */ +/* Set type command validation routine */ -t_stat hk_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc) +t_stat hk_set_type (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { +int32 dtype = GET_DTYPE (val); + +if ((val < 0) || (cptr && *cptr)) + return SCPE_ARG; if (uptr->flags & UNIT_ATT) return SCPE_ALATT; -uptr->capac = val? RK07_SIZE: RK06_SIZE; +uptr->flags = (uptr->flags & ~UNIT_DTYPE) | (val << UNIT_V_DTYPE); +uptr->capac = (t_addr)drv_tab[val].size; +return SCPE_OK; +} + +/* Show unit type */ + +t_stat hk_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc) +{ +fprintf (st, "%s", drv_tab[GET_DTYPE (uptr->flags)].name); return SCPE_OK; } diff --git a/PDP11/pdp11_rl.c b/PDP11/pdp11_rl.c index fb0f522b..113fbf14 100644 --- a/PDP11/pdp11_rl.c +++ b/PDP11/pdp11_rl.c @@ -110,6 +110,21 @@ #define RL01_SIZE (RL_NUMCY * RL_NUMSF * RL_NUMSC * RL_NUMWD) /* words/drive */ #define RL02_SIZE (RL01_SIZE * 2) /* words/drive */ +struct drvtyp { + int32 sect; /* sectors */ + int32 surf; /* surfaces */ + int32 cyl; /* cylinders */ + int32 size; /* #blocks */ + const char *name; /* device type name */ + }; + +static struct drvtyp drv_tab[] = { + { RL_NUMSC, RL_NUMSF, RL_NUMCY, RL01_SIZE, "RL01" }, + { RL_NUMSC, RL_NUMSF, RL_NUMCY*2, RL02_SIZE, "RL02" }, + { 0 } + }; + + /* Device flags */ #define DEV_V_RLV11 (DEV_V_UF + 7) /* RLV11 */ @@ -130,6 +145,7 @@ #define UNIT_RL02 (1u << UNIT_V_RL02) #define UNIT_AUTO (1u << UNIT_V_AUTO) #define UNIT_WPRT (UNIT_WLK | UNIT_RO) /* write protected */ +#define GET_DTYPE(x) (((x) >> UNIT_V_RL02) & 1) /* Parameters in the unit descriptor */ @@ -268,7 +284,8 @@ t_stat rl_reset (DEVICE *dptr); void rl_set_done (int32 error); t_stat rl_boot (int32 unitno, DEVICE *dptr); t_stat rl_attach (UNIT *uptr, CONST char *cptr); -t_stat rl_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat rl_set_type (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat rl_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat rl_set_bad (UNIT *uptr, int32 val, CONST char *cptr, void *desc); static void rlv_maint (void); t_stat rl_detach (UNIT *uptr); @@ -363,21 +380,18 @@ static const MTAB rl_mod[] = { NULL, NULL, NULL, "Write lock disk drive" }, { UNIT_DUMMY, 0, NULL, "BADBLOCK", &rl_set_bad, NULL, NULL, "Write bad block table on last track" }, + { MTAB_XTD|MTAB_VUN, 0, NULL, "RL01", + &rl_set_type, NULL, NULL, "Set RL01 Disk Type" }, + { MTAB_XTD|MTAB_VUN, 1, NULL, "RL02", + &rl_set_type, NULL, NULL, "Set RL02 Disk Type" }, + { MTAB_XTD|MTAB_VUN, 0, "TYPE", NULL, + NULL, &rl_show_type, NULL, "Display device type" }, + { UNIT_AUTO, UNIT_AUTO, "autosize", "AUTOSIZE", + NULL, NULL, NULL, "Set type based on file size at attach" }, + { UNIT_AUTO, 0, "noautosize", "NOAUTOSIZE", + NULL, NULL, NULL, "Disable disk autosize on attach" }, { MTAB_XTD|MTAB_VUN|MTAB_VALR, 0, "FORMAT", "FORMAT={SIMH|VHD|RAW}", - &sim_disk_set_fmt, &sim_disk_show_fmt, NULL, "Display disk format" }, - { (UNIT_RL02+UNIT_ATT), UNIT_ATT, "RL01", NULL, NULL }, - { (UNIT_RL02+UNIT_ATT), (UNIT_RL02+UNIT_ATT), "RL02", NULL, NULL }, - { (UNIT_AUTO+UNIT_RL02+UNIT_ATT), 0, "RL01", NULL, - NULL, NULL, NULL, "Set drive type RL01" }, - { (UNIT_AUTO+UNIT_RL02+UNIT_ATT), UNIT_RL02, "RL02", NULL, - NULL, NULL, NULL, "Set drive type RL02" }, - { (UNIT_AUTO+UNIT_ATT), UNIT_AUTO, "autosize", NULL, NULL }, - { UNIT_AUTO, UNIT_AUTO, NULL, "AUTOSIZE", - NULL, NULL, NULL, "set type based on file size at ATTACH" }, - { (UNIT_AUTO+UNIT_RL02), 0, NULL, "RL01", - &rl_set_size, NULL, NULL, "Set drive type RL01" }, - { (UNIT_AUTO+UNIT_RL02), UNIT_RL02, NULL, "RL02", - &rl_set_size, NULL, NULL, "Set drive type RL02" }, + &sim_disk_set_fmt, &sim_disk_show_fmt, NULL, "Set/Display disk format" }, { MTAB_XTD|MTAB_VDV|MTAB_VALR, 010, "ADDRESS", "ADDRESS", &set_addr, &show_addr, NULL, "Bus address" }, { MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "VECTOR", "VECTOR", @@ -1015,7 +1029,6 @@ return auto_config (0, 0); t_stat rl_attach (UNIT *uptr, CONST char *cptr) { -t_offset p; t_stat r; static const char *drives[] = {"RL01", "RL02", NULL}; @@ -1032,17 +1045,6 @@ as if the load procedure had already executed. */ uptr->TRK = 0; /* cylinder 0 */ uptr->STAT = RLDS_HDO | RLDS_BHO | RLDS_VCK | RLDS_LOCK; /* new volume */ -p = sim_disk_size (uptr); /* get file size */ -if ((uptr->flags & UNIT_AUTO) == 0) /* autosize? */ - return SCPE_OK; -if (p > (RL01_SIZE * sizeof (int16))) { - uptr->flags = uptr->flags | UNIT_RL02; - uptr->capac = RL02_SIZE; - } -else { - uptr->flags = uptr->flags & ~UNIT_RL02; - uptr->capac = RL01_SIZE; - } return SCPE_OK; } @@ -1063,6 +1065,31 @@ uptr->capac = (val & UNIT_RL02)? RL02_SIZE: RL01_SIZE; return SCPE_OK; } +/* Set type command validation routine */ + +t_stat rl_set_type (UNIT *uptr, int32 val, CONST char *cptr, void *desc) +{ +int32 dtype = GET_DTYPE (val); + +if ((val < 0) || (cptr && *cptr)) + return SCPE_ARG; +if (uptr->flags & UNIT_ATT) + return SCPE_ALATT; +uptr->flags = (uptr->flags & ~UNIT_RL02) | (val << UNIT_V_RL02); +uptr->capac = (t_addr)drv_tab[val].size; +return SCPE_OK; +} + +/* Show unit type */ + +t_stat rl_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc) +{ +fprintf (st, "%s", drv_tab[GET_DTYPE (uptr->flags)].name); +return SCPE_OK; +} + + + /* Set bad block routine */ t_stat rl_set_bad (UNIT *uptr, int32 val, CONST char *cptr, void *desc)