From 73df9b1c4e285912463fc5c37f35c42c1d904485 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Fri, 3 Apr 2020 17:32:14 -0700 Subject: [PATCH] PDP10, PDP11, Massbus VAXen, DISK: Rework PDP10 use of sim_disk - Make all PDP11, VAX RP and RQ devices autosizing behave similarly - Generalize the attach help to be specific to the device/system being attached - Remove the sim_disk_pdp10_* calls which weren't correct or needed since sim_disk_attach_ex provides sector size which is used correctly --- PDP10/pdp10_rp.c | 109 +++++++++++---------------- PDP11/pdp11_rp.c | 93 +++++++++++------------ PDP11/pdp11_rq.c | 4 +- doc/simh.doc | Bin 287744 -> 304128 bytes sim_defs.h | 3 +- sim_disk.c | 188 ++++++++++++++++++++++++----------------------- sim_disk.h | 27 +++++-- 7 files changed, 202 insertions(+), 222 deletions(-) diff --git a/PDP10/pdp10_rp.c b/PDP10/pdp10_rp.c index 56c9d8f1..9b0ed03c 100644 --- a/PDP10/pdp10_rp.c +++ b/PDP10/pdp10_rp.c @@ -90,11 +90,9 @@ #define UNIT_V_AUTO (DKUF_V_UF + 4) /* autosize */ #define UNIT_V_UTS (DKUF_V_UF + 5) /* Up to speed */ #define UNIT_UTS (1u << UNIT_V_UTS) -#define UNIT_V_DUMMY (DKUF_V_UF + 6) /* dummy flag */ #define UNIT_WLK (1 << UNIT_V_WLK) #define UNIT_DTYPE (UNIT_M_DTYPE << UNIT_V_DTYPE) #define UNIT_AUTO (1 << UNIT_V_AUTO) -#define UNIT_DUMMY (1 << UNIT_V_DUMMY) #define GET_DTYPE(x) (((x) >> UNIT_V_DTYPE) & UNIT_M_DTYPE) #define UNIT_WPRT (UNIT_WLK | UNIT_RO) /* write protect */ @@ -380,7 +378,8 @@ t_stat rp_detach (UNIT *uptr); void set_rper (int16 flag, int32 drv); void update_rpcs (int32 flags, int32 drv); void rp_go (int32 drv, int32 fnc); -t_stat rp_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat rp_set_type (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat rp_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat rp_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); const char *rp_description (DEVICE *dptr); @@ -453,49 +452,26 @@ MTAB rp_mod[] = { NULL, NULL, NULL, "Write enable disk drive" }, { UNIT_WLK, UNIT_WLK, "write locked", "LOCKED", NULL, NULL, NULL, "Write lock disk drive" }, - { (UNIT_DTYPE+UNIT_ATT), (RM03_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RM03", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RP04_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RP04", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RM80_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RM80", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RP06_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RP06", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RM05_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RM05", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RP07_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RP07", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RM03_DTYPE << UNIT_V_DTYPE), - "RM03", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RP04_DTYPE << UNIT_V_DTYPE), - "RP04", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RM80_DTYPE << UNIT_V_DTYPE), - "RM80", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RP06_DTYPE << UNIT_V_DTYPE), - "RP06", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RM05_DTYPE << UNIT_V_DTYPE), - "RM05", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RP07_DTYPE << UNIT_V_DTYPE), - "RP07", NULL, NULL }, - { (UNIT_AUTO+UNIT_ATT), UNIT_AUTO, "autosize", NULL, NULL }, - { UNIT_AUTO, UNIT_AUTO, NULL, "AUTOSIZE", NULL, NULL, NULL, - "Enables disk autosize on attach" }, - { UNIT_AUTO, 0, NULL, "NOAUTOSIZE", NULL, NULL, NULL, - "Disables disk autosize on attach" }, + { MTAB_XTD|MTAB_VUN, RM03_DTYPE, NULL, "RM03", + &rp_set_type, NULL, NULL, "Set RM03 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RP04_DTYPE, NULL, "RP04", + &rp_set_type, NULL, NULL, "Set RP04 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RM80_DTYPE, NULL, "RM80", + &rp_set_type, NULL, NULL, "Set RM80 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RP06_DTYPE, NULL, "RP06", + &rp_set_type, NULL, NULL, "Set RP06 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RM05_DTYPE, NULL, "RM05", + &rp_set_type, NULL, NULL, "Set RM05 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RP07_DTYPE, NULL, "RP07", + &rp_set_type, NULL, NULL, "Set RP07 Disk Type" }, + { MTAB_XTD|MTAB_VUN, 0, "TYPE", NULL, + NULL, &rp_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, "Set/Display disk container format" }, - { (UNIT_AUTO+UNIT_DTYPE), (RM03_DTYPE << UNIT_V_DTYPE), - NULL, "RM03", &rp_set_size, NULL, NULL, "Set RP04 Disk Type" }, - { (UNIT_AUTO+UNIT_DTYPE), (RP04_DTYPE << UNIT_V_DTYPE), - NULL, "RP04", &rp_set_size, NULL, NULL, "Set RP04 Disk Type" }, - { (UNIT_AUTO+UNIT_DTYPE), (RM80_DTYPE << UNIT_V_DTYPE), - NULL, "RM80", &rp_set_size, NULL, NULL, "Set RM80 Disk Type" }, - { (UNIT_AUTO+UNIT_DTYPE), (RP06_DTYPE << UNIT_V_DTYPE), - NULL, "RP06", &rp_set_size, NULL, NULL, "Set RP06 Disk Type" }, - { (UNIT_AUTO+UNIT_DTYPE), (RM05_DTYPE << UNIT_V_DTYPE), - NULL, "RM05", &rp_set_size, NULL, NULL, "Set RM05 Disk Type" }, - { (UNIT_AUTO+UNIT_DTYPE), (RP07_DTYPE << UNIT_V_DTYPE), - NULL, "RP07", &rp_set_size, NULL, NULL, "Set RP07 Disk Type" }, + &sim_disk_set_fmt, &sim_disk_show_fmt, NULL, "Display disk format" }, { MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL, NULL, &show_addr, NULL }, { MTAB_XTD|MTAB_VDV, 0, "VECTOR", NULL, @@ -508,7 +484,7 @@ DEVICE rp_dev = { RP_NUMDR, 8, 30, 1, 8, 36, NULL, NULL, &rp_reset, &rp_boot, &rp_attach, &rp_detach, - &rp_dib, DEV_UBUS | DEV_DEBUG, + &rp_dib, DEV_UBUS | DEV_DEBUG | DEV_DISK, 0, rp_debug, NULL, NULL, &rp_help, sim_disk_attach_help, NULL, &rp_description }; @@ -991,14 +967,14 @@ switch (uptr->FUNC) { /* case on function */ for (i = 0; i < fc10; i++) dbuf[twc10 + i] = 0; } - r = sim_disk_pdp10_wrsect (uptr, da/RP_NUMWD, (uint8 *)dbuf, - NULL, (twc10 + fc10 + RP_NUMWD - 1)/RP_NUMWD); + r = sim_disk_wrsect (uptr, da/RP_NUMWD, (uint8 *)dbuf, + NULL, (twc10 + fc10 + RP_NUMWD - 1)/RP_NUMWD); } /* end if */ else { /* read, wchk, readh */ t_seccnt sectsread; - r = sim_disk_pdp10_rdsect (uptr, da/RP_NUMWD, (uint8 *)dbuf, - §sread, (wc10 + RP_NUMWD - 1)/RP_NUMWD); + r = sim_disk_rdsect (uptr, da/RP_NUMWD, (uint8 *)dbuf, + §sread, (wc10 + RP_NUMWD - 1)/RP_NUMWD); awc10 = sectsread * RP_NUMWD; for ( ; awc10 < wc10; awc10++) dbuf[awc10] = 0; @@ -1172,30 +1148,18 @@ return SCPE_OK; t_stat rp_attach (UNIT *uptr, CONST char *cptr) { -int32 i, p; t_stat r; static const char *drives[] = {"RM03", "RP04", "RM80", "RP06", "RM05", "RP07", NULL}; uptr->capac = drv_tab[GET_DTYPE (uptr->flags)].size; -r = sim_disk_pdp10_attach (uptr, cptr, (uptr->flags & UNIT_AUTO) == 0, DBG_DSK, +r = sim_disk_attach_ex (uptr, cptr, RP_NUMWD * sizeof (d10), sizeof (d10), TRUE, DBG_DSK, drv_tab[GET_DTYPE (uptr->flags)].name, - 0, (uptr->flags & UNIT_AUTO) ? drives : NULL); + 0, 0, (uptr->flags & UNIT_AUTO) ? drives : NULL); if (r != SCPE_OK) return r; sim_cancel (uptr); uptr->flags &= ~UNIT_UTS; sim_activate_after (uptr, SPINUP_DLY); -if ((uptr->flags & UNIT_AUTO) == 0) /* autosize? */ - return SCPE_OK; -p = (int32)sim_disk_size (uptr); -for (i = 0; drv_tab[i].sect != 0; i++) { - if (p <= (drv_tab[i].size * (int) sizeof (d10))) { - uptr->flags = (uptr->flags & ~UNIT_DTYPE) | (i << UNIT_V_DTYPE); - uptr->capac = drv_tab[i].size; - return SCPE_OK; - } - } -/* File is larger than max known disk. This should probably fail. */ return SCPE_OK; } @@ -1223,15 +1187,26 @@ update_rpcs (0, drv); /* request intr */ return sim_disk_detach (uptr); } -/* Set size command validation routine */ +/* Set type command validation routine */ -t_stat rp_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc) +t_stat rp_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 = drv_tab[dtype].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 rp_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_rp.c b/PDP11/pdp11_rp.c index 4b8a956b..422240f1 100644 --- a/PDP11/pdp11_rp.c +++ b/PDP11/pdp11_rp.c @@ -578,7 +578,8 @@ void rp_set_er (int16 flg, int32 drv); void rp_clr_as (int32 mask); void rp_update_ds (uint16 flg, int32 drv); t_stat rp_go (int32 drv); -t_stat rp_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat rp_set_type (UNIT *uptr, int32 val, CONST char *cptr, void *desc); +t_stat rp_show_type (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat rp_set_bad (UNIT *uptr, int32 val, CONST char *cptr, void *desc); int32 rp_abort (void); t_stat rp_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); @@ -621,7 +622,7 @@ REG rp_reg[] = { { BRDATADF (DA, rpda, DEV_RDX, 16, RP_NUMDR, "desired surface, sector", rp_da_bits) }, { BRDATADF (DS, rpds, DEV_RDX, 16, RP_NUMDR, "drive status", rp_ds_bits) }, { BRDATADF (ER1, rper1, DEV_RDX, 16, RP_NUMDR, "drive errors", rp_er1_bits) }, - { BRDATAD (HR, rmhr, DEV_RDX, 16, RP_NUMDR, "holding register") }, + { BRDATAD (HR, rmhr, DEV_RDX, 16, RP_NUMDR, "holding register") }, { BRDATADF (OF, rpof, DEV_RDX, 16, RP_NUMDR, "offset", rp_of_bits) }, { BRDATADF (DC, rpdc, DEV_RDX, 16, RP_NUMDR, "desired cylinder", rp_dc_bits) }, { BRDATADF (ER2, rper2, DEV_RDX, 16, RP_NUMDR, "error status 2", rp_er2_bits) }, @@ -629,13 +630,13 @@ REG rp_reg[] = { { BRDATADF (EC1, rpec1, DEV_RDX, 16, RP_NUMDR, "ECC syndrome 1", rp_ec1_bits) }, { BRDATADF (EC2, rpec2, DEV_RDX, 16, RP_NUMDR, "ECC syndrome 2", rp_ec2_bits) }, { BRDATADF (MR, rpmr, DEV_RDX, 16, RP_NUMDR, "maintenance register", rp_mr_bits) }, - { BRDATAD (MR2, rmmr2, DEV_RDX, 16, RP_NUMDR, "maintenance register 2 (RM only)") }, - { DRDATAD (STIME, rp_swait, 24, "seek time, per cylinder"), REG_NZ + PV_LEFT }, - { DRDATAD (RTIME, rp_rwait, 24, "rotational delay"), REG_NZ + PV_LEFT }, - { URDATA (CAPAC, rp_unit[0].capac, 10, T_ADDR_W, 0, + { BRDATAD (MR2, rmmr2, DEV_RDX, 16, RP_NUMDR, "maintenance register 2 (RM only)") }, + { DRDATAD (STIME, rp_swait, 24, "seek time, per cylinder"), REG_NZ + PV_LEFT }, + { DRDATAD (RTIME, rp_rwait, 24, "rotational delay"), REG_NZ + PV_LEFT }, + { URDATA (CAPAC, rp_unit[0].capac, 10, T_ADDR_W, 0, RP_NUMDR, PV_LEFT | REG_HRO) }, - { FLDATAD (STOP_IOE, rp_stopioe, 0, "stop on I/O error") }, - { GRDATA (CTRLTYPE, rp_dib.lnt, DEV_RDX, 16, 0), REG_HRO }, + { FLDATAD (STOP_IOE, rp_stopioe, 0, "stop on I/O error") }, + { GRDATA (CTRLTYPE, rp_dib.lnt, DEV_RDX, 16, 0), REG_HRO }, { NULL } }; @@ -648,47 +649,26 @@ MTAB rp_mod[] = { NULL, NULL, NULL, "Write lock disk drive" }, { UNIT_DUMMY, 0, NULL, "BADBLOCK", &rp_set_bad, NULL, NULL, "write bad block table on last track" }, + { MTAB_XTD|MTAB_VUN, RM03_DTYPE, NULL, "RM03", + &rp_set_type, NULL, NULL, "Set RM03 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RP04_DTYPE, NULL, "RP04", + &rp_set_type, NULL, NULL, "Set RP04 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RM80_DTYPE, NULL, "RM80", + &rp_set_type, NULL, NULL, "Set RM80 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RP06_DTYPE, NULL, "RP06", + &rp_set_type, NULL, NULL, "Set RP06 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RM05_DTYPE, NULL, "RM05", + &rp_set_type, NULL, NULL, "Set RM05 Disk Type" }, + { MTAB_XTD|MTAB_VUN, RP07_DTYPE, NULL, "RP07", + &rp_set_type, NULL, NULL, "Set RP07 Disk Type" }, + { MTAB_XTD|MTAB_VUN, 0, "TYPE", NULL, + NULL, &rp_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), (RM03_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RM03", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RP04_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RP04", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RM80_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RM80", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RP06_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RP06", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RM05_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RM05", NULL, NULL }, - { (UNIT_DTYPE+UNIT_ATT), (RP07_DTYPE << UNIT_V_DTYPE) + UNIT_ATT, - "RP07", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RM03_DTYPE << UNIT_V_DTYPE), - "RM03", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RP04_DTYPE << UNIT_V_DTYPE), - "RP04", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RM80_DTYPE << UNIT_V_DTYPE), - "RM80", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RP06_DTYPE << UNIT_V_DTYPE), - "RP06", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RM05_DTYPE << UNIT_V_DTYPE), - "RM05", NULL, NULL }, - { (UNIT_AUTO+UNIT_DTYPE+UNIT_ATT), (RP07_DTYPE << UNIT_V_DTYPE), - "RP07", NULL, NULL }, - { (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_DTYPE), (RM03_DTYPE << UNIT_V_DTYPE), NULL, "RM03", - &rp_set_size, NULL, NULL, "Set type to RM03" }, - { (UNIT_AUTO+UNIT_DTYPE), (RP04_DTYPE << UNIT_V_DTYPE), NULL, "RP04", - &rp_set_size, NULL, NULL, "Set type to RP04" }, - { (UNIT_AUTO+UNIT_DTYPE), (RM80_DTYPE << UNIT_V_DTYPE), NULL, "RM80", - &rp_set_size, NULL, NULL, "Set type to RM80" }, - { (UNIT_AUTO+UNIT_DTYPE), (RP06_DTYPE << UNIT_V_DTYPE), NULL, "RP06", - &rp_set_size, NULL, NULL, "Set type to RP06" }, - { (UNIT_AUTO+UNIT_DTYPE), (RM05_DTYPE << UNIT_V_DTYPE), NULL, "RM05", - &rp_set_size, NULL, NULL, "Set type to RM05" }, - { (UNIT_AUTO+UNIT_DTYPE), (RP07_DTYPE << UNIT_V_DTYPE), NULL, "RP07", - &rp_set_size, NULL, NULL, "Set type to RP07" }, + &sim_disk_set_fmt, &sim_disk_show_fmt, NULL, "Set/Display disk format" }, { 0 } }; @@ -1418,15 +1398,26 @@ if (!sim_is_running) /* from console? */ return sim_disk_detach (uptr); } -/* Set size command validation routine */ +/* Set type command validation routine */ -t_stat rp_set_size (UNIT *uptr, int32 val, CONST char *cptr, void *desc) +t_stat rp_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 = drv_tab[dtype].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 rp_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_rq.c b/PDP11/pdp11_rq.c index 06065447..f1625018 100644 --- a/PDP11/pdp11_rq.c +++ b/PDP11/pdp11_rq.c @@ -1086,8 +1086,8 @@ MTAB rq_mod[] = { &rq_set_plug, &rq_show_plug, NULL, "Set/Display Unit plug value" }, { MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, NULL, "DRIVES=val (4-254)", &rq_set_drives, NULL, NULL, "Set Number of Drives" }, - { UNIT_NOAUTO, UNIT_NOAUTO, "noautosize", "NOAUTOSIZE", NULL, NULL, NULL, "Disables disk autosize on attach" }, - { UNIT_NOAUTO, 0, "autosize", "AUTOSIZE", NULL, NULL, NULL, "Enables disk autosize on attach" }, + { UNIT_NOAUTO, UNIT_NOAUTO, "noautosize", "NOAUTOSIZE", NULL, NULL, NULL, "Disable disk autosize on attach" }, + { UNIT_NOAUTO, 0, "autosize", "AUTOSIZE", NULL, NULL, NULL, "Enable 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, "Set/Display disk format" }, #if defined (VM_PDP11) diff --git a/doc/simh.doc b/doc/simh.doc index b3aa2fca7e9cf0a1d3e85cce48ede22c8e67dff9..75fa5257a5587c05739daf7491fbf234a9edc2a0 100644 GIT binary patch delta 41452 zcmeF(dE8A^-#Gp=s3gioB~uyhOqr*U1}Y)brHIH7sbs7SDNczpl!%-{k)ceXq!U6Y zQ!p?aybewfEU)?fvYkv}af4 z7+$vQ-Lc5|f7v6E2Fg*tojH5INXkt&|7=#Qm(dH5fGmZ=bl>?l35S*AicLOuTZuT-yO+M}_` zrNc|YzyI^^=bsOY{xcqlygVlo*%V8rzZI*SI6e3L-+C82|5J$0#pu%?6N9eG@@)v) zxqlhY=X@{{`Qge)q^QkH$Z~vrBSj)mY2sVO@3k=lbUQ{X>p&t@T~UhAffD zMjBlfiKMeUYb0`ob!R8k=P02*C9ShLLsM<5#l}Z7g*uF`9=oz?X@xRW<0kH<2~D|= zW`sAkpe3E?%nQl-)nmCT4O4uD3B1h$7V-&;Sj-YW<8#)tA@yeUSi5MKp~~TJ2Pk+& zByvBa`GSk}+}b?DhwLR+n%+xKX7CGF<%mRX=LHt9pVB!ak*-W;H~BQp`>srOZyCEi zdE2eAJjwd?V-1pHTg0=4(j(!y8p-vy#>!o^K~44~qqoI!RXwbDgqX_2$wz*!{gBnLyS0?xQGy{OUXiUN^m=Oa3{66ixAHGG@vC9(34*DrVmdOLjD~68O3YN${r~Z znXNE~5132H%X}8FhA-H`Z>ecDWA{Z9zbWrzH+u*4Zi# zhxb{=a(-e9TiMRfgod|^-5li@S7>ZUNYDQ`*gce+z zI&|P+p5;0EGk}4FRz8%M7{gdTOf9VyyEU5lPYl@vno)LhBV?)I_8YjjXb8%nJ$Fx_ar?Sz(C$&JQJA6BtjRR z&J0$unqN|@Ylrs!i}J7RU?;l>-T43qImKzN*1dCa4SC2*=<?t zc5YD1mTdWm(z!p}RzLP>BBeg_SwN`Yrz~Y7U$Kwh+0Q`^5w_t7M~SO@Ch~JF*HMr{ zgzYRwajH<2#@xfbG`&hQzfU0qqXjMLN;d{GgrU65FhamyWh4`s#3!kx4MH>jM0pX5 z`IM!E;I3p9Kk^etImU5L@)sci5kZfVMhc#c5~W(bo~(;9_QaFX(5rtmIP3E7{;Y!93xI>-j|S>eB`I{HKKZ>LKUiU6QK{(peF5TPha|_ zrrjH&+D|#bbMz5|dfPVwSL!Wh`eEtJ%lzT%=!J%q3h(7DB(vP8t=cNPQa6 zFn8qcNV-B}Lg#EobGp!#K@4UHFYz*=1CL}B%UI4&Y{{K`>yB97)Nf5=d83Ifp4rNF zekOGJUF;^0Zl9NmRH8Cfs7e?Xs&g}qxra`4rVHKZP8d3R(39~@U_J|2m`7t-q_CJJ zEMqx)*+-_-o6SOF$&^>jxR}gbN*1zlIi)E>ZR${$deo-@=``k1I`TXN7|4qZVlXf9 zG81^41uV>~v3#Pim?eD5=d55e-}5JjIg*-ozs6EGY)q(NSb11*c+Uwc=aVm{GM$;s z<0JN5XT#}KNE8`YI1+iYa58O5ta8dw`)o9E#1f8i{KC>s`+0_|y*n3WDMxuKQi-s} zo2X7h8u2I{d5q3eI-mdZ7YVz-$&%xS%~a$a=CO(I_=__XEEb7e&t24~Gkr;w z)c4rVPOdIx|3O>2FppInEfq;bPAgnrS_7gj9huB5`j!z1*0Y_ovNn!;c!*Ib_B_EHR#U9J4oyu4^9p0AR^e_3W)+Mu6^$sQSV+8*k%2nYXAEz#gyrn4q6tv0 zn#i;CCdXRII&EXA<{818CV(@X3z*5z{6g02t&{e=$vVzZp-3dsnx`4Zo7^J6w=$R^ ze3D%HLu_jD(+7QwY1l6Ie$(*e9KPlx1w_6Uoyf>UKjqrRZ3ms`Op>qIN34XF!VNrq zgO33>B%=?<9!Mto#6C)He>iqove^T%Ldmj&W0{iKbH&?^ZjdQc;;Lu7@^yKAgE_p< z4_qOY&6vu5@=IZJ#<88BX(^2l@FYF>oJ*zdZeC^;*`%yF@35Xrr0R4e<6o*@hgkpU z_2J2o*QW?MUCkQ$N?%B4NM$^A{Ufm-qiG?XA(bJGA%!0&XZ|!#1V6EZ9JktI(U~5sBFAkG7%5CS%2SiuxsOS=8=!7C5OirMaV);aNJEZ$ z?fMwQ1dcV;Uhgx6(uOfD?8aEx+5o`aZ5(;>?1Q$PY0P8|>p0Qg-s>SdjLrsn=5!GO zP8>Y3YuneUGd*LmXw?vw1uP_^hRxJ6Ra0Kr!Ec-)mztNQAs;8-?j0+VYTY~bcC=}D z;t>*D*u2O>@qZ=l-#g(X^JH zUcf@$Xs*4a(gx@y`Nt^dyWi+UO>XCXKHyw+Dx?~{5StUN6rRXvWD7L3!w)#R;1!K+ zI0M@1PUL^k?u~rylv9-k#lDE9>!D%5$6i zzJr|I?RIJQxMeW@3HxP^J?VI^heqAg7|gF6;?f8(7S;$gy^;1c1qc8m!NRsOlK73M=@(f}$ zbNP@3tVH*|@IQ5CxGsM6Wwtsijcj!~Nn8E;6Upm_#PTH@Y>H(|-TG>5X*BJ1PahDB zgWM$mwNq)MWH7C^@{jz)Fadcbl{Pv&|B7-cfhf&>4y4jv56>S^ZY&`8@FnX~X=B3k z>y(QMOflB6K9x4k^H;4`&WKTVak@ktGN-P3E4DA1KeKX(L4u6!eB)WIl+vmE6Jozc z6JeXL^m{HIr6aGC@wy4hAFzktDf66xslRRF%=3~vz`;BB(UJ#wl`mP()dR(wZuF(X z3kEKl(&+`CCdMjEAUVj{O?FXvh_iQ$NWD4Hr-}5^RvK1ZmStAFoGKPxl`kxGE!)^m z%(A-ClU}^U%S>kvd-*F_a7wI5(pise$eqsx!Is0-Lj0U6*yc5e2O^mRV zNxaKc=ChmszNU;d6tjfll%@<7Xiax|F_>4F#%z|dlJ#WN;?7}?1?fC2l1faq$Eb1E zU&Aw9c#@vYmP8eHKseFNm$~!Wn{d6uitaMV!WU! zJ?YCNat_x`*~&IfbA|O(C1bsrtuH%yD8y*qU;!&gxBdrcOV^RkDfL$vMyTKS3`ld04RjH*jol{CXX`>$Y`bYS~d;UzN&C>sJ|EWC5 z`zF)P`?|A@?Wx>zV!NVg+m#zx&Qj{VW$;a*m*Jt?P%VADX<2`#-+RoCys5skm%${S6;ZF|FF}Rj|Uq7Qc9cl1^ z*2<3`+5oPa=d275(t#vzaZk#7=saH~8N&oVWC0I-VtM?;b}BBCJzCL@VT@eVz^NC7 zrIcQ5grFNe7|JWW$47j@I)3LUS(bap%<*ig;UC4iMa$jkZ;dC}MlPRh8Kl4CIUb`E*9(3TdQbOZ zB315Vd&+W8DUTHVQGCfd9++vHIm1~lla#DfrCO@o0`E(!rrcbT?x&HSnMx>K*-1fLvH~Q3(OYEqA;gwS_y!y8b@91*j zUGpxy^WeF6>sd=RXh!li-;sBj;h&ClV?K+xbh(;xE!R_x+j*L2m+O%$6u#u*&opvs zQlFuWB=_gO9-{XOA!Qh&ILhCYTd7Agp2;j@CB;_>3uBnTG-h#>zlp4NerI(@A8{1s zF>Q^W$3m7e^9y4R*RL02PLOGXRzn#YZM4f_GBa7r2Db7GdpOKrM848nyRCMXpv^oV zqF-Gd>(Zc_sD&to2!`l|$c3ndh=pi{NQEec0EOU$z=WXexDb>OkimqYEMA%1_(=TY zx{o2Liu!Pra?`ZzuL7Up{+~%JDFi?7kF~mTSEt&mc4?g3xPi3POVHRJri56dKS`1|YyHn}wH1x{5m2JV3q~K;{I?!>mhTKcx zY5FpleBb+6NiFI!lDC+|Eb{;0Y$r9z^rOFRk$-O8Y8WK3P5a;vj&hPy#J4*@BP-eI z#S7bS*T#O<6}kBrV<;kZx#v}*(?H&64-KY~?Hz;cU8o(u80()M3PJ?fKB3_?5_aX%w} zNJi_&izlBg63>&|c1F8gUs)-8{dm#jp<1$E;JeuNx+A@EA|LP}^Z1sX#6&bi^&<9j zfQ$$)5anJX*_)o{BA86SIG!)r=3-4M-vi+*!_6KZ3!SNc!+6DHDa|aDiYD`YAKTIV ze8e58c<*xp-k%o*a1d{>gdJqtp+S?Aa+D{XCmF+7Rg>1NCS|7fu{Xo!RPRae9c&V@zWo#cgp%X7Mp00-sRLmWN1m=L1e~ zlAHe#jWE}reH_kZbdPMw;e{O2 zP533&CYpYS7YN(GqqabKA*=b5>yC&9-Fbs${6h4oL5q5H=WW)pFO|MSMZ4@%zT}vZ zk#u@8mZj`sFZ;Mw^h4xB)I-EWv?sHlYJd5iR(~Z&tcZ0y z*YQ$kcgCX8L`X&-2J<%IE$0q*mWW15WQj(~@F-mv!`rOnOAd0FWTSbpYm&F^ ziGA9jl?@F62pb^XzN8@op#2+M@dTYATRL&o5*}tOP~)aPEsNwA`InyJ|IN%*$WZ<=zLU@ z-P_0VCcE8iA8=cpc>l16XmIYJC3$dvEUjEd+>49x3%tk-W^#$x{xj|e{C+T1?tq=w zV+WN_kw0@ZQk@p`;cY%=KY8V#8jle2Gnypx2zd%Q3h4={326x_3F)}(GVkMQMqL(7 zj(8;gX0mTx0o>Bm!-l4!nExT$vi+g>70CjR#)(MWT?;YXfNi$(@Blo5>N4c=l3)pJBmx{5~D@)gZ< zMkB3rI<(rOaEN34aAh=doWJ?kRiZ&xdN7kYoVZ$RCCfF@$Q4xMNuFm2P4Y$~_cM@h zxHMlhl7rHe!0pRk*uZ>2|ko&r5BoDa?7=WnG&D=tlg3`qFLeWUPa5R#M|5A$+p%&#Wtpe4# znT9kXV{Ofq+wvfL*w0yOzQkI0v!Af$>$sj0l%xt7HF;1iIuUA+lWVw^2G>XHMjBrq zjXYFTRe6%WOkgs#ibW%J>C20}#A_VjPsSCGM#ghdiKvsotN-%NeR{@9uC#)Od4xd> zW(DzoMI&|S&Tziw3?f zaphCFwNfIbL8qQ<%*hHt;Pcj-1$cA~`u4zb5%w zH2zpu*@<-FB|_vw)I-EWv_qs{;6-+^o1Mzfy-WD)7hc#w7sKnBA8 zt=Refn_b(u@S(g#*uND>9*oD+>W3VS;zFJxqopRv6qfNbS*7Pj9%dwq*~uREGEbU9 z`gW%3XNu2_-Vjn3(iTz{(iKvbk*1raiFJ}0F-Oo-<8Tx1zn$V_(X zayS1totAVu&0cO;?22TYw_?4*zAg1@=6L>ST6p1;tmV`{-t=E)9Hbt|5}y=J4}ZTx znzM5kA^josPcnj;tmY6`N_%ZWlL*ZrG=9y>4XwPHx;%!FXrGc=A<5Z|) zAfzG98OCS|*NsMQNTy#ApPe_P;U~6mjbP@cCcUdhldUg~cM8qrj`Ool9>@_dm@KkQ?mFQjw0pQ|}eE-Af^kmAB* zqX;8t*Z;fj*Q{_?92|gCpc`7>yL9EswI6O&s7L z$7#~Y-}#=O`JMe-o^JH#Ne1vTOIS_5#xl;`G@@POyqb+dZ=PWwgBi)VWbT6TT}4C0 z9%uQ54gUVZMj!I?b{l!e`3*j|cStoX6n{TjHDmkV_NQ_-r##hF`DQXU;h)vLLe)~7 zZ!k#>rf8TbS2X2JYOUzq;ZGkkRHa^`m5$$jq%R5a*LpQh2| zv;E_F!)L-4=XYPNwrEl=Bg&k-t#o{H@|qhAtp|(7(-PyX=Lmn1&$Z& zXYZ9(@>pMCw(<+R*vrM%eHn!*!mZpvJ04~e-_ia)`*R*QS31&HVFt5U#ae#kH*z*J zB+-OsjAJ~@SVQyX7S4eCjc$}{;kche9OIjonhl>k;PV7MTGHMaw%Qrh9(2sx&KTcb8)F!=Si+WvyoO6Vhz4c2jnT>a#p83cNkHUj`twRETZ#DL zXtr0Bhm&M_crJf5S)x?@+icT4F@q2IJe93v`_>-N!2JHUlP4BMC48z9yb2|e*|Eg0BpYyfQtkm1mPy$ z6^N%ZgjikK9&{l&Q9VWT819?@zz$zK%j=)(w0S=RB~qH6y8 z%$XC*;j0fv-g#2aGnb1dMqAVvRnB(Mn zR8`2L8u=*4?L5P?4B*9%8s#nyt4)11nNE2Gno{p?%1Ft-3{9*zx_lQO&vV_$% zNZwpEzC1mn?!T#jCUv@qH+hRp>UI%T)u9@pUSARFc2XVwBCKX34|O+uGBcH4Ej~N? z*i7a3SinM#Q1o&6XZ{nO=MQdHweCFrk19@5y$wAb!E=i4z5Ja4OyMj3Aa`#G>iwUi zabF1(F#e&Gz!ryO%Xqw)0B-}>1x zv6lS_0|s9{Yad0<=Zsw3NiF^&-runvZ?lZ$e8vub>mMx=Iim2*^A^CB1N@PV#0LsC zSCcn2<(7Dh=-oCflAlq$Moh)xbmXxMmAq0VLq%Uz!I6YYWmG6*<<@onjF3idO9xH|IHaJ}wZg;z!ywmFp4 zvdHtgLl4^WFt0M2C9Gs02RTdp4S^yTH&cUNJWZ0ZEMghIvYV5fp}?4i&Y6ty>4ti= zq8$Sn##CnT2}{_*c8ZNPwyJ8Ty~^w{P~9oRhz=ga;qoI>)mn>*tSO znLJp>F@@LuJBQg`b6CVfyvibWk$JSCmu3uN9hb>)F5o4w74b%hQGtEM_mh zb@al2?ld7(hsHNbXPk$zkr2(AqSmC*xSo zF^Y^6efsk$|K)UEJ+o{eY@)#*cM8dqr=9q7no3}y)Lv74gft&vZ;V}i3&EF$aM z(MWyz@Bx`8IszdJmyva1H2FteIXd^%fXp-q*=mryEqrY%WiBqiki2XcQkE^Gtf7?U zu-bMEWjM3=fIS?fn5vY#P_2d+s`lB1>eaqb#oiaH`T2#aUU{LqEiP2K|AlHV@w0^L zmZk#LChGUC6xz{^UaaM7icIoiy3&V(oaXk)219C0(Vpo|A3kRz*S-^t6rd@+xa3{q z0?oLeRG)p`LD&# zeN}$$!9Flsa@alb#}lElrMZhbWGu6{ygeqbmAr6 zVJg$uPNy06vpm5N*36K`wF=+zGdIn&0konG9qB@E2Jt;xIK>(Azo(sX1Le7ymwAOZ zc$0Ven7=tq-dVZ}#VI!{?u>3S+9ZDVQ9(ObxpjW7r<>(>r-b)}<&S3q;e938%=f%7 z+tDAt@GCdX5g11C8V%m}k%+7xSms=VK(c#XSLjT*&!G4}J%q29Qodd)8%hrm&aaxkR-tk`b)pwfv5N2LVEqHB zX8pHNn@71$T?(JCPo$Kewb{bWOVyXVmP%}Ug_oCUQGCdz<&JvU&T)o+W`9YI&ne6pI)d>moEjL1kZErI)9@L53Ng`X&E;!L&PGtUZ~Ye zDiJEQ*2=%+HY*G(pKgUSc+3hrU0CVe7gkuoN-O?j#eXFm4b-#F%>X(#%ANbV_P_P9 z|9pFU?kil=?wmkwtuGd69p9dwQU35H#yZyN4hYQ*GMv+S!Dgj zX>RgUfZ~*-5%+v^pJ70uDG$(v-`K-3P7?dpVL!zwNmE+UnJ-w+Pi$j1`?w<6q+NVQ zVv%4hrh|=r`1}T++uk$kewI+r*U6|tSoD3o@SS9FaiwI$}EC?%*sW$xzzqSln1TGZtpn({b3d6p4u zX9xQ^L{>G+PEFET!@3`&xUi}gp(JJ4%Sj&p$pZO;b!_50CflUBY~g3}+pGeV;3oRf zpT#WYF!5~$5^7MFh72dUEny^8n9If69bl4^YiLdzUS%Rbv7J2};D(=dAga@Vx0%8$ z=5mPR6#vCY#{`ZY`0c>43;)lRl6@bJKc5Jx`JFdZV+=zqekc{ay%GhzwGb74^&Btm zaA3i`J2em5?>0WMmwn9LV|?T!f6;%h@r?LB`yN)ZiVMvl^~NLdX3;SC=Lxf1FHhtT zb)C$6e854DQN+s2a}$mEl8yYpHu9-dVH)!QuP}k4zlj$WsluJqWeBgamd#|gF<0+Q zIO;}%rZ*v*Fxw?ANnzXwQS*c{!5F{I+D*k z79WrZ32I^qO)274McKh`!2t&gbU0}2pu{1Y%vi?p2Y*uY520io>&bUihaq~*&_(39 zGPO?F!}4FohfZO92=zNfLug4Nl%g(8=|jIij1P7Hln7qrb>36$g@kHnCkGX&#Qn6SKZ6)U^S>mE$9R>|Oyd+k z{cQvIlT4?~2cibg@j9i>+~g4Tj2QA1r_LIi$rg!4(wN4_42Z@egBihV{K3g&)vocC z_l2-_;8oU=<)l#4gVAi}G!@mS8KJ&^6Y7_yUN`eN6ZxJ{XY~uSI6gZ+2jBO2W~X16 zK%6bvuzURd`WajBhOL;Q;_r}0#q)9#)yc2oZ!?il;Xj!jk45GX&lHPf;w{Ff>Obzg z`@~6qzbqDuw5KbFIYGqhGtr(dg!iXd!7lc3ndRiAJ3V-valAu{Y!?YAm8n8a?qw!( z*m6-U5&2nRA7@CvI2LI_AD*EfFYp@0E{R1-QkCkor!!sYMlS|YF|(C%C-;$H5OevE zg{)!xrLoA2OB=@`?)&sJg~+8jR#hLx;k~v|MWO_*4%05{;&RTrPXsyho03u zo}PTaN4#`a_Z*BgbQjEYl0Wu{|0_{*ytq`esWPMb0_Jn(4K6ml?Qslxjl`=mU zsS^^IUnoMT9=GXF@G2t-;i)VXAsqGS&3kO&N@4kDh)Vi>R$45aZ_k@7^|a50Z}ssR z(1R0e?roOZ)+b&tn$1fhv-y!zscg^qJ}>_% zMfQTR$aD%6ibXzS1z&Mv;aH?LvsuD&exzFwZMB$P36r_MR4meg1jBickJ-tev@RWs zbfR!seWPsb_DGp>h72;5msNhO5R2?)Z6$Bm`{x$+ZaVjW!`@YUH(V&6e`eFU-;?D^ z$JZr?zZfr(9Jb9d;R2=Rks@JxGqxzr7L}$0BMDnLgX?Tr*wUMMmiGu-{W)RFm)gQ* z|Jd4}3TtKq;-4iy9iVZw9B5B=?xEqp`1@`BF_OC8=F(MILTFxM24C+7613k5tKsT_ORM~;d{6RNRB623q(!XCWkxvfnNe<{A< z_JsQ#M{=6H9yb7-yVq}K7YSVMx;MgYN5h>w!;Lb-Jto6#8N=NK!;SdDz3sxSIi<8qtAuml!ycK@6La+3CD@y03qxzLKj$@ zEVVJdFtOAzX2f<3wGH9UjNv9=;f74%UP4ZDygj>Ia zJGX>;tAtyhlyBtPfTk`5YUYxr=4SZc@A9B_t_vaDfg{{UBHSb*+z{fGUM|Dx?IMbB zSBG#1hj6Ec($Ag0IYGGeK3r`ct}G8%kB1AI@0{q8yXmgXc+dRS+2=3v4OiucD{#Zr zvelM`D<98axfw1h3|Fp&tI)!AVZFAWzosf&u@kPY2^YkKi&t9xCFa=nnDrm# zj)y7WVFGrTEgWX{hB=>Mre&BJ8D==%UCFT@Va8gRV;1I)g}Gp1-dC8b6{cN$_A+7U4?}$z%EPc5hKA5vLr)6L zKa4f`q&~Id>-bO6WTqyWvL}vTq$ynNauAA9f@(D3K05ItgPFiW7O|ea{7&o=Dd#$F zqAAVj#jA{BCM#LZE@GNrrp%f`afLgmMYwx(FZwWw*?hnneq%Ss$#JQR2Pr}g?w~2% zd6J>L!!(w$h3y9(ibrmwF-_>mKn5{3;o&3ZvytC9NIaV>s3=Gk?x87N8N$m7OP3PV{AN^%!<>A-UgU_1+0#1769GxX)- zMyk<{emut{7PFLnTx^KElnOK;oi1teKUg8$d^p@xINVG)+(hh=gnRA|;6=jibQiLi%^cq+s2V1J7>~YZ=$(d@+D`4+4%OPGdNEff}ZwXR@kAGT4q=|;^cvy#&I7KmghCLj4+mDvIkyQ zDwg`Yex^&^R9Q^k6_aPgpTtsV62$F)1M?nSDU|A#WlUnItAxpO1+_)G(FD^|geXb`GU+em$Nx zw4)#Wd5g)c=UdKl$+emz)oDWqdeMhx=+EnnWt3JsCgEW|i%9*;zMAdq-j2sH>dajegM^yejp@j7!^#1dBX1z)kWg1r%^$W~Dr5+0VbhHc!W>(!)N zWx1h0gBZ-~{6x4vV~!hDhR*aLhwfU42DjO1(~?KHxQ4$miP?O>V!q`U62E!)gMtnQ zZy?;`uPW8Ki^v_eo-4@9wG^ikHMoOD+)EpB)bl#VFo9zY>|q)jpJ~HZ_7Z8Noi&pG z`fcn+c$CfzVHoc)oy`wP1JgR#0_N}upRtNBA2vX-i5>jTA+kQIGUViXN>Pq#+`(Z^ zJSzX`9p#W_bmB>R^BhB|_LzG)@H%fXo_Q={DQnoo^PQxMgB;};mv`2U$wOgE@e@B& zyNh%sJT#;^ZFz{F_=R6N#0gIET31nF79UWln|&qs(u_g8%u&v8e|KGyO>Cvus#2Xhs6|84X-YFXF^maJ2$gq73D!Kn+Io1`Ak0`cOxVw52Qk z8OB&9aq?w5EE17nLP0(X@W?BUgXqeOyuwKS9Ihd9lC%*jMSiZQ7?WSsU75j3*7G$# zvX$+lM21})=5Nl9vi?h6Gk%kmG_D~Z|DqU;Xv%%G<1xC@i#|NVa}44oM)5jJS;;EC zVGG;X#Xb&m>@~SLp>Uc^qlKM2#~9bSe7uh*yu?WQO%M@YVl;0sk#~8Y9qi!%N7($f zEhp}O>~|;8l|Z~JsQ)4 zr%5n`xqQOcY^G#NbZAOTCNh=nsf58r;gOHEdS)|^`3v-Gu3c!{rW!Q~_xyU66?{R> zPi!qi8A7xr+N0&8?#TJsPc=s_=@VE{uI$}4N+KdCU5AK1!ne&@q4jAkrk6<_f! zudUT>2zQ>kjsldVBGsuyU0TtB9y~>!4PHw@!fn59Ktr!$hX=E;E@+BIRKT%lU(emSLsqi$)%RA) z%|93ySjk#W68+K0Nmg#-E(Y@oW0}BC_VFjjsQQy-(c>rie@fxkt#Zy4+w6>j-yDcg zf+{?|%ZrKacG%3jyvG7QVFhdWif`G$9u9GY8hccnvU{b48>va%z4BjAp(*$CARTy; zr+AhDZ009s>~jFZLYA_I4IJhqjefVI;wheGB2&q--#&mFC`SdVP(R_}9-7dMKJ;fg z^Z1tU`Rt$phf5BL0OOdnWk+_A`zld6AbH#+yuG8ap`3_Oo`u9OUR(`9G}? ziY&Qy!%&-Fb??I8C{jNmX>C2M0M!wYaH5Jk9frWkNh* z8h$2|c4%^u2?AW5#ra%PEa#5P%vqy&Hj@~rMPpiC;qq)|GncyAJx^1bGsVg18T`c= zM&~rCkBLkn+<)ZLgomZ9rqoqx&!7CwDdJa~y>*SR1^6Y8Gd&#VZyvf%1bC9ZOki>- z7cirPmw1f>{K>e2&YEyhAzwvMf<##l?=X{H9HKyBso*AVrz73z#{fn!nlpqOZ(PPz zROJ?8*PEhCxcNq9E^<02GkxgK!^O;HAz92Els6TAVHXEDO19$8%afY|RN)pLp$m`G zld*(5g)HGSzA0hC5ZBybz9g;bz}I|7y6*#;F^aLYDwPn%Qs$?Xwo=?OBl0F&*g<+( z?SkhRNXc?e%+ZyeG$}9FOko-I zu<$z5`GAl3oHcCZ8^Wy+e&!%2$?iveN}(Eh5DmGHVT`U3 z<|x+mg&5VjiyiEx_w6FXaUyqUT-0F>^SSm;)3&&Sy4=mZWUHkyQl2VQr3Q7VPebmd z1+8kye;b8|=tMUjr#I7hk8k;bKR81EyG$CSEswI6O&la#T;HU&zwtdk)3J^&$^c&G zV-~Z7)d>$9`IgOWWgEZp8^3daKRC&0?yhSEaYQ?$=HzMiuU8 zDSAv{2D4bg7YPp=2p5=dWy=F5!E$LU;iVX*DZ_2lr2&m-LQC54AP>`(Cm78bRgU|d?PPgS zJE8<-DaY;HO@jyJznMZyTG5_|c$8;&mI1uTLY5F~XDe9FT7Ks^S=!rmb1enw$x{@1 z$exulRH8DsaD4~Ed5477snCeVG^06fd4XZ<t{CRusN)#V6y71l5|*->FZqVe{J=JLvX^Y9btx)Sm7AzRP41;7ZFq#o=*;6h zMc;&nfedCQbJ)Vq>|ihZIK#zf>~_h{mE_|(3Q~kplp~!c^r0^a2J!;0@g{FGiNsV7 z)0oLTK4t;S_>3>v$oKrnPL2{es{&j{F-lUEF!{ATo#{qTdNGLMjAArn8FyCx$16-_ z2JbPC6rb`LYgxzl=>3tb6ypXeQiVIIjf+|$gZPjIEMyH|@hzL#!d8A}Z^ZY1`xOpy zoReH+rp=|Kk(28vP9^G6pY}XVH=blXGnmDP%wq-X_=-(@&kt;2CwthJ@Nk%;L}OM? zHm)Eqw@{bXJjhc#!$1bJob~)oG#-n@NFz7-xs$u8M{6GDF*?(Y#Pc486DAgaNSIu_ zh{bH=d$zERUpPjXz+9N3l%Oo-xRtxOoBL_SSl(tLAF-HaTy&9%%VFYiR)s>8pfqEc zz}vjXJm#~JZwQl=|KLx~a>>OO#I=;747YF_jc80e9-}X~_PkZ_@ znA2REFi-OgS+0sj3Q(RKsl!5+u)-wSuei}=F39+tC`)qKU*e9tjXa)wv|-G`s}vXJPoqOk78{nwkUNP>~P$4Bhs zPg)nz=qOxFdV=C+QF2WQ`OoL8_n&SsjS|xmB9}z+{Vz)VZ?5crSeNbpU)m;e8-y*m$%sy+ZX{*rwlD6LqBQYt88LqU*mi-f~) z2$XUt2!()FDlL^(jyNO%s%u3kf?^?>1;!)NQBhD4Y9e?5q8vhjR%|ucih~lYqJW@Q zJJ8PyKGaYwbr{D#*qP7nW3yr3zAJ&>ci$ehOMI<+#L4~tYhBz&9qdjX|BqTEC**)s z?>JZM$>aYCS=?XwAa?Tj|CJZrac<#X{`Y_LkN=4i@;Z-ol= z22N=#w;&GBCz!s0qdRi{{~U$n6EZ!3yV}Vl=#}kBNbjs};Vz2V%vO4J)o$<+2RUE) z+=>x>^&?!(81g8fte+XD&ms7y? zq_~T?6^y#TYBZz?ISeD}0dHXui;0`S%o0ggiS<9$#CRU2gm*Z=v7^EN-VE+~Le)an zGQkluDda`|##zh7XN+Pj6^&uiMD-_a)%>s6u$VGL~F!WD09}fz}7qi;Q9%-}ykI#iv=-k*ex!Vf=ya~OgUWHz6F<-e@EUIt z$4YUebZdrD(u|~$E)(ncgrI?uETU>@6k|~-RYXenyIsU;))PldajewiJTpQRCKYfy zbBN=llE#)G(Z>nBO+}=XY+^W-s8TBCKH^%bXQt6g@|zhAr*fQhc5_RD%8}Ay_dUjQ z!lN}5=!+&YmFdi84jV}R*;Vv;EVZaZUE-K1j)*?YGUClm9gX7=eKbZ9(Z^$K=HDEo zV<$tb^yJ6nl25PB#`?+b;%nq~wUkiIBrB4cxNwQXlm2}SHZz&26jH=}JVYFt#DPiN zeN@gk@}(Qsafo#JMx1R#sYXb>9P9s_oWm`~s$rjH5>XLxIZ?^bgeW*Tohl=w8N@+B zmM)+ZBd<2%$(GSpAGu>JcBU|$5}x2iUS=O3GA((nt&qp^Jcxr6%-KZ!54(7Lns`iax~;e^yOEK zWi~06@eJG8PU03%L=&1*#%uiIR(lSGq5Rb4V>FO=sqfyGi zho1CfCC|}qj{CTV0-ol1YRuIE(1)Q+9sqi18%zT~#ZV zP*C+=w_Hm;Z&J?C`Su1z|G}2czWX%*{O$p-h8>jCVSy*)4(8JDLFYB2#zTGvu!i-F zTWCheT4eoqT;z%PC-WY5sAc3MHXAMwT6-3Q*CoBWbv7p6<(~B(NahPt3JN#a=(u2`x`AsqTQcn2 zVupF)FZOA2w_3lP^1cv-GpNld#*#|`n|X=Lg)3LlEGZy~DwQ}ci6fD??TGS=EkrfM zYN9xy8c{0{(#7C&cY4#G`&h`sMCY$M)xdO3`gphVAO;w89!NZ! zG0{NrCZh4+e-NFpXAk?SVjTE1YDOnkVFV*Fgqzy4GqE&vXs3^e`9H3H)7HOeg65xU z>9!5g+xH_QK0cfqZ8-cCK_UoarOV3`uXLytJvyWsZxUTvrxs*{Lle&bl}c|AUe_%; z3rsY|99RXJ>O~8YVJ=2!I67Qr!)!&rqym4y}Hj`9zEY+{`u*tOYctac;r*D zs-`Y%95$#^t>-1tBdhOmiiYYLrr+@5oVg}hn%6k|D6J$j9G#ZdE;XiE_`@*FzHC!! zZnLod*&QYhuXXBQ(>!;@(u;1RnTT%9Uh3ZViF&2kGZQP*j{myw%JdpVox(k7kCyK3 z6kb(3{I2Df8aybh8)^@NRDr3a!Tq2ijWDnu7}F1o=LcS35G`*f`SIJL)k_PUHiZ0o8;_ZCgtwP@45Y3o*PTefcArhAv>ty-2&93D)GL}jc4Ww?GkTmBYrIMi%C3UDY zqau}gYC=dOl7#xb*X`ct@qB;ZKYoAw@_OI9?iu!8>+@M_?ctog4c}N`_{Q{!)v8sB zN2mYgkD@BdF@K#rb?Q`ju&lq!QJxA^BvpN8+N{{*c*)r2DW&376Pqi?liM$imzvTm z{zAOSeNzf0nzWd3ZxnfHG|BJq@Bj68!+}w>%o~plj-r>c-&c4_M!evZ<%x#zN%v0q zD^aKH3l>_-lk01TMgQNwtJaL7lF^h7X%`j<_4wz%^|h00C&cSi2`>r%{_p2cKOPqS zOCpLc>JvpD$CDW|^ZwI+zo-r+v;Tf3iW1S3{-Gi*YvjD(^vkTI z^yyNl;E#$qjm!DHzV?**XS6))KRF2LDjOGz@Ow(d+(kp${yJk-eCGX2R-SoZJXejH zm0R38vesFtT4%+ook*r9;;wUyvtH z6y@W$e4@f}{vdXa-a;C=IEQm7&(VE5KRUYct&K1hXGc*RHsp<>{MMXKsLe4#Z7N&iO^i$3dU^cW zSc_1D3RI*Lmk?f4m1@+ZJ~z^i_H>{lVL6@X%suo@X4H?LS9hG^1ST?@IjmqMZ?THi ztl@3mVH?|1GwR20kM$1k56>Ou!gHhOW|F+mnTBvvhO(6X6itt!YZ=7Ld`po6QFJvA zvw}lZEf__8d7gcg(nmWKO7`m%Z=7s+WxRN@^W1p8}#I^8NQ?-IH6d zj90I)UB!N4KLsgN3}pyKH0=n|Y5Ap6z_dkL*irY8byXR$-rVT$mE1k&813p*)MTsYs<{oA6s{h{kfL`3`~zoXLY6r{4s=aJkATe$V;giSL>*mFDcJw0iok9<~7!{fgS8* z7kl`I&^do(AIJEe{5oek1t>&eLI*BENiODJT)~wzq)~yWQPfx=^zx=OqZ{3Mh!Kor zG-C)OVH}S$oo85@TH7RkWh`^4@-kAq$#TM|S;JaBU@JeekDoZeLBh!Tm7|<%ROP1v z6{$pJst`tBEo#%640_PBVAL$?rO=x`gdsYBfsAGh&oYbIJjYzZFkZmRY+^ItrZ!!t z&u4zC{2hDwfgcG&{xC=Qo0FVp3Mfi3N>Gw8EnLLKTt;2m(3Tr$M|(POGo9#3FGe$_ zP*gE`Sm9B|@)#4D#52rb87baK&1)8KAL|_!7GAfKU%0rid4Y+n=Pzm$iK5$?&sP*a zFN#|5Fl)$F)ZD@-HjuZN3NwLksaISdXHD@i=T-Rk)Rr~L75~S?mo*P|>TU{DDwk~7 z;vdsuxn#~0`I1{(#H(k%p|;CeL8$#&*6|@9ae#vy;s`$zTKF5sNYk=hl;(Uc;6g4U zM4CZ)6i+vx8&&&T&rgCm}sCDTz~nf?Psns!)yUgcM%NWi;k$I&(`AeWr`Tt=vY) zb9e4$1dlS7$C#U%*IJ*+oU8miFYprc2z}#K7O{ere8Q)E#ut1^=s!Ez#cv$rTzx1% z=@g_8p^u$MQ7Th~Yq{<`b7WJ6=3Gzch^@(>8{Jbg+Jrf>yYfSfU?ig%L+G?)d5l@i zW;rWZ$tqS8I`(=tu$S*SMWlnrNRUS8{JF_PDN1u`QBl22p)U2PPZ%MMXv`hl$uKfg z^KJ-H%~T%F2u2b{)1!=KF3+=y)vRG1>)F62HgkZ3oMF_RNp8;KY{IBarvSC6O-owQ zx>(daYNODWFmyX|6Mg8*qm1P-9%npZcu!>->)F5#b{0#{ygFVYwYOcoL@aZsM|QD? zZwM2@kL;s_NueaQsl%nz<#NKL(SR#x%MIK^Z~D-W{)CBTAcL62Y?iZvmBn?IRSK(F z!+JKbp9ADd&FBz1ORf@P#+l^dEY9W}&ZR2VXi77h(}I??q77~7K~F|8nlU`Wqm1Qo z#xt8atYBpco#ics)vRGH@9-{P@Fl-;l;2YGZqiwrg~o&mhLwi}hxh!!r4DQQGLHo; zWEm-bI$y)N=R#3r#zl^ZE=s09AFq?L^Eo`0`I{yD&hhM}o%H(@=XrNgs#AlS)TRz$ zjrD0jYcl9TPkPatK7?8gU?7h&mgktu^SoHn=J+LrQ1$ubRQ;k0tbj$V=HfE8@62Kz zD_Fw`;+mCCfD2+@1AURdwg*_4@Halm=lx{_iMR_oIGSIH?5!*+(U1klW{v%zPleEV;W|{On|h&hZPA)gFzfCG($`xb=zgX=#~-hkE5xvidZO zd5y2gFOeOY$015f;7!b658u#P5^rGu19^wDB<^~~vx##g>?U4h8@VOw?-z z5wU-T2SZjLAY^ni?=ejBLNY@l(^CKH9{(zq9+DXn8Il+h_(t-Tixb6?RbI32wByov z>Ey0a@!ZK)cgM@5hV`)UtHO)^;%~mIW8+4iOVyN0bm3tZ@ilq%gsT|A5`IWs)hoU_ zRwSpF{Nb@Gb#-y-*G*Qr&vbHq@A&Jn^!gsj;5J6_zgO*W?@+bAs+JyJG@V5(rba5g zfBbN)a!yBVpfirq86T!@ecK5JH89mOh7nij=&8#0#XpK=e&98KbB@>Ky!KV)4ZO#0 z26)dva+cB0`-iiGy%fCCHj3U1WD^A&+C}7IYEYBLTule&HZ~7(sUn%v6tn{Bw**u{|N`mXjhdFVC`WW=MH}7IG0@SG45arQ>oO_u20j;YSW;?KqEhUZ(-igz+>i^)mkr;?fHMgxZKl6W@*d5x^NHB5?I z_vE%W%q$0MB`!KW$K-t|ezanE%@V%lJHC|ouQ*DX4mLV;qH~9=@FZI0_Me=HOJ~Fhr4Nq$IQ}-s%9~&>3Z256KU+T)q@wKt^ zr#yUEFphAY05nadPnE&+rpjNlg9!pMF_r#AczmLA6@jSAAr7a~pA3&5R&FaGH}C;l zQ|V8K$G0k%7nllcWm_u!8IKp{>e_~vycC|rkpiY zu!M?Kr5d&9N`D43mWj+~5$o8`eO^<`Fif*1qgaQThpu>hAS-^NaWVno57g7%TRx@?7tGo_^lfpWW<96(?4XywI55jWA3RNO=#v-&9GaGn=KX;I5UH#}4*T`z_g{3wJPqsc*G(LPcR6RaY7R^kX37n8+)n zc%Q8tOrv$Sd-jT_0u9;)zm=i`^2vfaBqT5SxSV>a>dU<^y`J(-l5{hbC8g6<;4KRYCb2`AT1={S+jFHstJn^|y!9dW{{F^zi7H+$FQ! zLUvQ>>(nG8C(FZSb``7H$`J}LcQ8p09%Bh#kyxQ7wBSJ&@F}ObB$crt{%WkpC3;3j z29sn1zf(?!xSj#L%*W)F^mEBi6+(vzoh5XT&?!Pk2%X?L_Hg$a-JN~ZTbr!@Lzr9N z33F?BRp;zi&dYxF_u230ll`t`+3!4(^=^Y_tv<_CKIU^ut~0~alYT5`6=$tiQ_iO> z^|+b`d1$>s_pZVRoVh_irZFuU$5e{H?NcA_e@94}z%-8W7d75BXqm>xo*3Vu)afUWiKwti+)`2UVL}y)#9**C$u-oFWj!FcVsp9^gex+ zv8D-QJzp|^H$NPz+>zS#e!NU9BPSql2u4AHC`1*iayw($&ME4@@013w@-d&#X^XDK zI99MPmGOa&UT2?j@ed3JT9Omsssfx7-0A|{RN$J?Mew?Q7;0N598US@<-){O$>kUO zSo+{+_9zc+3mrLxxEll6z$U(87yCHKQBH8lMUpPACTADMJXPL{Zl>X9bN*a^vE6?qae;V#I z(=mLP{=qLC;{<<`w%a}!`ABCl5ASa5RMQ?qkt@D2O|p?KoFM+Km5`4r)S@Y^SioX7 zCa?M^zPftXe*~zW;4I;F@(NDA>>zFaN1&cfRsYz`-SSyMD<(k2d61#x1gnLB6&I5d z+3_i?{Y7X&OG=4Bh(`uDGxf`4tVNoppStykY&t{df&t_#E)92rANDuoWKBE2URM< zIDRB`a;GETj1Ze%%;x|VwYVp*@+KhyZ&6RnLnQjMgg-dJ75|9F%n*@O#_lj(hR75n zM5i1%5nA|-drV9N>JB519#B z2^k652$=|32pI^`50MX14-pU1ex5_rJK=A-oJdZ3C*C7#P^M0OACJW{Lo$XimN|sC zyhM20FNC)?$bNgPtVP(2`Q48JjN}nEvW0wq>hIK{9_9ZsHmJ+x3}z@NiT$k?Ui7ye zKVIW4*0GUuVzH<=!xOP+Sz0VAc1A3!z}4Ky1ZJ|AW883NEV_-``H)Z8#{nkiiA7VG zN{SWy$;mtwV^O8EVo^1E(1+>FVIv=Kgrg)|FO3&XHry9q)3S?(h5&@dhlYnnpF=;5 z>d)J}!x4VwLhT9dtW9WZPjcG3>hF+~I?4QlOrvILGxtxX(NIb$m5Fs(<<$jFn)|3s z6>jHomhcIAPU#5@;SEkuDH0LJ@fu4A(R?U7qN&qSP4>GZULx7If$c-Xril?@>(Mf6 zhbDRWU_8BgPTVVs@xwgA%Pb_f*#0x_hy8sdRsE0+ThAlPe^WYlENVa}hA@YBI7CS~ zsK?!e{3LmjWrRG19EJ3R)P%Hzl!SETJ=^D7N?^ zK0dko(s;q}nNafJZ?-^(evTK&45AE3=m~>h!Xrr~O{VdN#5luiv!G7mIG< zQ@&A*8VAMV>_2?w^5PvFO_*L zY*E9bAv*UFBDA=ej?XcEXLNRyKFN+$8;x$u4V)|;i%wDe{8&_iq8FHQXuuU*NuM&Z z!-5NAQQAeZC>Q@#i{qgdH7%_c4Y-2VWRSDAo0MK zsmbkXaSx#eg($}PwE9=9S=9DlvFNUHs>%R{F`MVPwtOsV&M+R~ah~8XzcQmjESkj` z6=TluZaU!u_>7#D6t;ry+|8qmBPTfypG9PQfa=2Bo-&8O)_XRY_nB zPmru?q<5%h+M_S`F{`?%fo*(Bs)mukSM25o4p6M7?9-KQ%;p6?<_pql$vkc7$TXf| z3)_j;jzwqI&eURsyO_s9*6=oG)`>;u(3BS3OlJmPYG{*WCOg^7`Ii}%w4psCc$itd zz#tw0A<_@?2tTrqW1KCjc^Sfk zjOGcF9O5u%i*#OY=MF|A17V9+{`3~j#_XAJh<gw-?ykkd#^__m z9?eT7iX;y=O`Mw?oGbB2rI6^5qFuq+TI`SJIuCwPMNE^R*=$W2O9<6)Wbk zXg&GmF`edI&p%GZC7p`1;_>lwlU--V2Zaq_>f79jQnB>#!U1gI?|;1MzrJXY>U>t> zxmb(ve14rGo$CmlC3KVlOlBdQ`I*8xNmD`x3Y{l(oX}}PhY6i!QL07W#FAKM=p0}1 zHI?g{C+W)|+FfoVNhYIsf%*JRT0J`s%wu?c9fnP8;{>q=IxZJo;dLzKsVmLY9N{Rx z`I=^QLLpB>y`OXn)0g|0LXsDl$2N9z`&H%wKH&?#<9q5gk}2k~kmLN#-o}E$r&sHx z9OF27u4yZx*XYtbNSh|MKio+#1~Z4`wNlSd9H&-O6C$m-i3udRxLGW^B$;t;;?+`N z1nyub#RRiBjk%xSlC$Q=%O-a_Fi*A4pKy{kJo+(hg|-Jdedm94g95rivGDxMEMy-) zQBWFAe=ME!vGhN>T54CJM44E6c)lA?vVfOU=|vKUV^_Yc{9tyfCi%UY;}n&y3kd1E zn4A1P<-E-i&TkQm%5yz8GLG4t)6xzbm(z&RJj#4t;q{gV$Qufu@fE-D8>L&t zq6@i=9&F(g4s(R#v}^5ozT_JYa)@&?Oz{k0G~-#rW=ge@a;_(XJKB`cZxrrlC}SAQ zRAwZLl}Y?iPQ0Rf*^u4fFS8r{v)@;1qck}5j)Ga$4_qj$Wcd}u{#N1@jO12({%O%n?XIRf~{7EV6 zD#N8*&h@mWBb|BZ21%ua^ubEb9Yn_M1yKvMKalbQ9xD|~R;--(G~WUbyv!2bN#&~&Ui^;oyKLgUoEKM5 ze0tS;9(bQEfe3uSKoJL8#A50x|D)v*ZJ2x?Z(RCs+FO-*K5JCgrui0+)0%Nz$piUc(9gq+$=p z8?0k}kE}&C`uFKDXOhEb9d@pZr<_=>9?MKx)O6nEJ+|^8=U8+Bicp+pbfSS(wBim1 z@*2xn&Kiz#oT7KD3TLZEDQa*vLwShNJkmqQT&b`Ib&d9t=xOB~;@yi}{%SM153-YSgA4H_^4vm3FoJ+8WZ1PTWaPwy~Xw_nEzz z&G-Sa=sDJ~nO4aLbrb6|a_auQ`sY%oGnmP<8MC;ZMS9KIE=` zCQlZoGA>WN8tb`G`4v{MlHVxbU;bHsugCd?D^#sN_x_`bb5(EqKs)LDP5(ijXEZPH z5x-D;umlbM&kncG0Lq##vrhVNxx;jpbs3~m%dk5>F|(ETw5KP1nBn~k*v+?`B7VQ! z>IZe6p~l-VnX>tDrcMp^%8nvXHHb0>H480%BD8ztV0WtQ~(V?4=w zyw6U)Vb3EvKUa*k4EiyYrd%o*dHfZ)N$Z9bUCYrM-LmQPeiKALFM zeWoyRs%e{_lVJzb4Ev-V4{oD7Q%JIgjU3>JjpYxVm;rnj}x4t z%+sx$7J1qs2`%Wt9gJZD^LUxJSi?^CP+__$kE^(bO*8C~&op|IEv`u{$yhJIxgIvn z(4ME+&Y6Oln@1T-9l^VlVS<*)bAmRP0)kYKcgPA_Dx--}*e3+-6YW|j6a{Zg_F6?=nhEk zz9*44*`idUP&fol&-Ai?r|+C;_J_EODXij0@;qVIr6Z5BmAumI8^6(5-e()zIm{7? zOK(kXWiqSTk53W)^Y4g{znUc;ie-jpPEk-&8!(6@Z}BaEaDlvC%Pov1*TU2?HR-jHt;*;o)LIPvX=ikS$Dl!^a+o~^n?ZsA@qtOdPO&S(u=V?#w+Zj{Ik}` zTCSPp+!L$FH#-)!WC%;hGsn&cXOowFb7IM#n@LaBseYMh84}ep*)V)WIsBBfPqZv8Nyx;OhvzhnFS;r^JJE>g#fi!MW_>6C;|FQi0JKS$=;ic~4mW zEM^nlSBWq9l80Zl zdNpRGdW>SW^@R0*LIH~li*LgL4sy{-N2M%h1#91O972~>+Qe0>Et9fqOgn30$?cot zwZl|eJUQzfCtI`jIjg?wOs{>;TFLR@$JUz@)iZxk#p6`6%(}eD0+#UxVO{Ik&fV5` z4}*DtO?*x_>mNfs>%Wqw^xy(@x%hN_qAGqjWhYmxRbQ@KE3tPfj9;fmv6N5N+u>yo z$CT`XF_( zQ^NNwL@a8UU8~1cB2;LLm4CohRv1>kzzSccmlfWVz0&KmS6ItRYyV@#Cz7onHnOt5 z?UOajWqthmKgQU9K8?-#NY+>EiYF^~F%~cAlGvS*Q~y@lP~d%?ov}Q|0$ygK_DteD zZ7IqSYHqb*;$a@)!fiSat5O+V?Q&(_Y=5}r^vixTu_APZT{SL|Z&M+Om7Npgr^IP+sC zaOp`Ort$<&GK*Kq_lc9&l%@<7sZ0hpeA3=DpwOOM=)?E?#P6IS@u@w2DpHyDbfGuz zvyC0>W*-O0pSxi*_1W9N-^2kg3c&!p>uUODf0&W^tY+mY_V9sKuq+%q_&N zDV=L+&JDEZUIy_Hli9;w4)HVj)GVFGwBbFreksKlt7URj$9UvBI~Lsdz3#!CKboJ|&jDWFXMW@ae=_nX^BHOTZF|_rCbGLj z>Z$ID4zV!#7Z2ZPJtwnNsO$5*!V-?~JLRmrCiQ8{2Ykp^?531TT})eUVIs3BzgN7d zOAEqp;9jXCf8OnbcwH_(~BsA42{9rnR-*KnHH&1yUU1Z;Gi!Df%#+ zrMyW^wYZ8-bY(7!_?XW*!5L~+kt#H&JwwR++5FJ_7m45zp5hhNUP-8SIt8gs9d4#G zBYBkR+;l>+=*1M0%;#@*{HX!_O0K_r$%jUa;3=w{tY;VXq!{u5f1ffpNAc(!3NW8H z86As9W0}ko{KAQ3-9CwT+lR1rV+vb1`wyXJAW6R9B(>G2BcZ;35$ab!y{_P1p5seG zoz*XVM`Oe3@7wzXFW>1>)=_V(eu>2`a$4}TR=l9%FH%C~OH!W(lveRMJV&VTuPjW& zqgRNf#iKaSFeBBXfB4Axgy-|dKMrP!RNAp;~%X#jIM@tkoF!HQ;^e~U`1ZxRX``$xe9NNBd z`|2$J+s_rtRxHl?Z~Ol!<@}vo)G^U2IeS2&N^;kL#08m6W(d+{+Fh4Dd_!pSP;%Op zQ}5IDj7P^+=MNg4t&P0SQp)9xN9B2vr-D`OF7HJ%Me!fEDPAmM}(Ch;crTw6L%NHxH}+9_&GA) zT44Y~7|-N$bzA209$Wc_+WF&A;q+x5~c$B+TJStr(Gagk_sLi#MFYS%zdl5S?Fwo84`?Bow`vm^ledx3B z=x&Ao{I@l0)4y@uzaQF~U0Ql*Y0ingVnw=-EPrp*s#&fmgL|%v($4Jd$AH|in;?Z?d)0Afksme)HNYTsLX{sniAyo@` zg#uC(Qq?MzF+3crv{G)(KtlRn9<5<5 zU-0Ec(laKpA-QIZq;z`NY@hX`)x(L!nK>&93l9qo3knO_Ms06y!b096XMw%T8X@K5 z(FEqup|VOcl<_QJ8Q*b)&Q;=356VdGU zhPsYr9-H`y{ajcs9{r1JxSf%V;#I!l5D9H7NMS;I$1@>y>m!M0V|8-c{+!3ARWyy$ z;}Y8o9@p0K#57GCvzl1M?>!+jyc ztrWvO{@yC=3a%n9d_K?hvqi)0#aw4p!mTSf<3g7**7KU)zD%F#O8l`|*N;0DfBI_7 zaEV&DRwi7j;LF=BqwodWJQbbDyv*)nGrNv$?33K(aAuG_h0*q{X4M09pTm+;WiuL zE*aro58*}*;ie7Y1`Te;kQs$LFNC`+gu5wJeaKZGV^nCo@9|G_b;*-a6t4ab7bG{C z<9fRJF0EMTI)GPQYVrE%3vt8cwc%3OdTYaFji)cm3|9<>%hJLnX5pf*!Mn4ri^{qj zDO?^Cu4oBYpL97P>fs`T@Kyitwf*o7@FE4A;w)+h^CHJXWt|$h#EGb?0$RiIc`YAK z*0!@p_~KdkI$4j)1-_n>HiWNbh3{B}??Z*}>x3`hgzwFSuUv$$ScGp=gl|uTFG_?j zIn2wv-C;)$CrSF*9Upx9)7kKW+@Z&_KGe$k6lv`<4#($Yoo~-NwHr=og)>OughV(J z4F?`!uQlvLhTV^_sR{FcnD4{v9cJ1v&xN5HhEeGLVdR&T`qXzHCBBY5G0n}R*86h< zZ*x3X6vfVPX$KXkL_ONkfqQs_vCL*AtJubV4w5)i_PK!iw5KD3nZh&{vXRYa>Ipw8 zBy`1GROA}2CEP7~FhiKeB9`zT-?NY76wKoyLCVpHYiLh@1~85nna_H5vWH`&pQR@h zI?Lr>TuCFkF@n)dXBltu0sA<>xo4{^m1#{+dNZ0?JjW)!;|KnxXkJ$~av5!DN6$<@ z#_%Z5kYYI>a*!jW<@0@cE~G9u(4M|L#(17%6>IsLa6j!66fnTU9je3KsT*?(w=$OJ z$$ZI=aKGtK`GRme=KN;0f>h=@n$wLDjAj-qSjAoRja8KZHFW_(=;Ba5xI@F~tz3Im+!fkg~v7a+cy?F??&TU2u z!Yy-0^9bQ?xGP!B7aZmHf|cAx#r#);+O(!8y$N@uoy&{NV{>ZX=ZUg;G8Zb(G>`Yb zKyIsfZw+&udGc!WTU?>H_4G6rt`;8ty_xDq*Ea4m9qt#g*UVwXTmyB(sjyLTkba@5 zs+?0>bxcL3r@f}6PwSf{u5>QyD&P4qHGRprYs@g$Ijz&)EYiUjr8=2~ZgZN}wq*Q0 zrn>u_y}93PG{k#(*S4jKEyakVrbow9zd2@DTf#Im!L$;$C4RqhJoV?}X?ffeSxjCM zlc8eryO`7ylTl*QUQCvY$uKebSWMm&lQTLSKlkaLVse$31UHIF4>1`gCXb5AGBK$v zCgIZjx?(azOqz?yo1YjiV)Bfb{7X#MipdQjCM(6HyqMf7CI!Xhdoh_RCa;UhE-^VQ zCdb6&n3yyblP|<0d{=pvn4HtpF};}V6qE5{@|~E3Z*|QPlR^W0<}D`s#iP)JP6UZb z3o&_8Ov;PN8IG4eFOeCKW{XLo(=jn1Z0QWXZKCphrK~tbiRjEMInRY2wSZ?!8HjA- zGaT<~COkp!0@M#5Csgk>* zNKt_*JitRVt1N9yXD(~l!~<14&rG`kvuNJXI!Ih)py%>qCbQYbCp5Q@(2_qmMdhoF zcREgu|Ix%h9!;IsBkjgm;c&0bfBsu&CwO7KL~o#_V5MZCWLnX}+8KqAh8F}5ZlaTmZ@n`1#FJ^g^7Jjgx?iY#)zp9| z(-N`xupq|6W+?m+5JD)T(?o9Ybw{QRjpC&OB+|OUhS&7sRw4Kjfwvsmtj^p diff --git a/sim_defs.h b/sim_defs.h index c94f2707..d0ff3cdc 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -433,8 +433,9 @@ typedef uint32 t_addr; #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_RUNTIME (SCPE_BASE + 50) /* Run Time Limit Exhausted */ +#define SCPE_INCOMPVHD (SCPE_BASE + 51) /* Incompatible VHD Container */ -#define SCPE_MAX_ERR (SCPE_BASE + 50) /* Maximum SCPE Error Value */ +#define SCPE_MAX_ERR (SCPE_BASE + 51) /* Maximum SCPE Error Value */ #define SCPE_KFLAG 0x10000000 /* tti data flag */ #define SCPE_BREAK 0x20000000 /* tti break flag */ #define SCPE_NOMESSAGE 0x40000000 /* message display supression flag */ diff --git a/sim_disk.c b/sim_disk.c index 38cc708f..f5fb4615 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -53,14 +53,6 @@ Public routines: sim_disk_data_trace debug support sim_disk_test unit test routine - Guest-specific routines for PDP-10 which uses 1024 byte sectors and - requires mapping functions to allow access to the underlying 512 byte - sectors provided by the sim_disk routines - - sim_disk_pdp10_attach attach disk unit - sim_disk_pdp10_rdsect read PDP-10 disk sectors - sim_disk_pdp10_wrsect write PDP-10 disk sectors - Internal routines: sim_os_disk_open_raw platform specific open raw device @@ -282,8 +274,8 @@ static t_offset sim_vhd_disk_size (FILE *f); static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); static t_stat sim_vhd_disk_clearerr (UNIT *uptr); -static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype); -static const char *sim_vhd_disk_get_dtype (FILE *f); +static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype, uint32 SectorSize, uint32 xfer_element_size); +static const char *sim_vhd_disk_get_dtype (FILE *f, uint32 *SectorSize, uint32 *xfer_element_size); static t_stat sim_os_disk_implemented_raw (void); static FILE *sim_os_disk_open_raw (const char *rawdevicename, const char *openmode); static int sim_os_disk_close_raw (FILE *f); @@ -306,11 +298,11 @@ struct sim_disk_fmt { }; static struct sim_disk_fmt fmts[] = { - { "AUTO", 0, DKUF_F_AUTO, NULL}, - { "SIMH", 0, DKUF_F_STD, NULL}, - { "RAW", 0, DKUF_F_RAW, sim_os_disk_implemented_raw}, - { "VHD", 0, DKUF_F_VHD, sim_vhd_disk_implemented}, - { NULL, 0, 0, NULL} + { "AUTO detect", 0, DKUF_F_AUTO, NULL}, + { "SIMH", 0, DKUF_F_STD, NULL}, + { "RAW", 0, DKUF_F_RAW, sim_os_disk_implemented_raw}, + { "VHD", 0, DKUF_F_VHD, sim_vhd_disk_implemented}, + { NULL, 0, 0, NULL} }; /* Set disk format */ @@ -321,10 +313,10 @@ uint32 f; if (uptr == NULL) return SCPE_IERR; -if (cptr == NULL) +if ((cptr == NULL) || (*cptr == '\0')) return SCPE_ARG; for (f = 0; fmts[f].name; f++) { - if (fmts[f].name && (strcmp (cptr, fmts[f].name) == 0)) { + if (fmts[f].name && (MATCH_CMD (cptr, fmts[f].name) == 0)) { if ((fmts[f].impl_fnc) && (fmts[f].impl_fnc() != SCPE_OK)) return SCPE_NOFNC; uptr->flags = (uptr->flags & ~DKUF_FMT) | @@ -2031,13 +2023,13 @@ for (i = 0; checks[i] != NULL; i++) { 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 dontchangecapac, 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); +return sim_disk_attach_ex (uptr, cptr, sector_size, xfer_element_size, dontchangecapac, 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, +t_stat sim_disk_attach_ex (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontchangecapac, uint32 dbit, const char *dtype, uint32 pdp11tracksize, int completion_delay, const char **drivetypes) { struct disk_context *ctx; @@ -2079,7 +2071,7 @@ if (sim_switches & SWMASK ('D')) { /* create difference dis vhd = sim_vhd_disk_create_diff (gbuf, cptr); if (vhd) { sim_vhd_disk_close (vhd); - return sim_disk_attach (uptr, gbuf, sector_size, xfer_element_size, dontautosize, dbit, dtype, pdp11tracksize, completion_delay); + return sim_disk_attach (uptr, gbuf, sector_size, xfer_element_size, dontchangecapac, dbit, dtype, pdp11tracksize, completion_delay); } return sim_messagef (SCPE_ARG, "Unable to create differencing VHD: %s\n", gbuf); } @@ -2098,7 +2090,7 @@ if (sim_switches & SWMASK ('C')) { /* create vhd disk & cop sim_switches |= SWMASK ('R') | SWMASK ('E'); sim_quiet = TRUE; /* First open the source of the copy operation */ - r = sim_disk_attach (uptr, cptr, sector_size, xfer_element_size, dontautosize, dbit, dtype, pdp11tracksize, completion_delay); + r = sim_disk_attach (uptr, cptr, sector_size, xfer_element_size, dontchangecapac, dbit, dtype, pdp11tracksize, completion_delay); sim_quiet = saved_sim_quiet; if (r != SCPE_OK) { sim_switches = saved_sim_switches; @@ -2228,7 +2220,7 @@ else t_stat r; sim_vhd_disk_close (vhd); - r = sim_disk_attach (uptr, Parent, sector_size, xfer_element_size, dontautosize, dbit, dtype, pdp11tracksize, completion_delay); + r = sim_disk_attach (uptr, Parent, sector_size, xfer_element_size, dontchangecapac, dbit, dtype, pdp11tracksize, completion_delay); free (Parent); return r; } @@ -2328,13 +2320,27 @@ else { /* normal */ } /* end if null */ } /* end else */ if (DK_GET_FMT (uptr) == DKUF_F_VHD) { - if ((created) && dtype) - sim_vhd_disk_set_dtype (uptr->fileref, dtype); - if (dtype && strcmp (dtype, sim_vhd_disk_get_dtype (uptr->fileref))) { - char cmd[32]; + uint32 sector_size, xfer_element_size; - sprintf (cmd, "%s%d %s", dptr->name, (int)(uptr-dptr->units), sim_vhd_disk_get_dtype (uptr->fileref)); - set_cmd (0, cmd); + if ((created) && dtype) + sim_vhd_disk_set_dtype (uptr->fileref, dtype, ctx->sector_size, ctx->xfer_element_size); + if (dtype && strcmp (dtype, sim_vhd_disk_get_dtype (uptr->fileref, §or_size, &xfer_element_size))) { + char cmd[32]; + t_stat r = SCPE_OK; + + if (((sector_size == 0) || (sector_size == ctx->sector_size)) && + ((xfer_element_size == 0) || (xfer_element_size == ctx->xfer_element_size))) { + sprintf (cmd, "%s%d %s", dptr->name, (int)(uptr-dptr->units), sim_vhd_disk_get_dtype (uptr->fileref, NULL, NULL)); + r = set_cmd (0, cmd); + if (r != SCPE_OK) + r = sim_messagef (r, "Can't set %s%d to drive type %s\n", dptr->name, (int)(uptr-dptr->units), sim_vhd_disk_get_dtype (uptr->fileref, NULL, NULL)); + } + else + r = sim_messagef (SCPE_INCOMPVHD, "VHD incompatible with %s simulator\n", sim_name); + if (r != SCPE_OK) { + sim_disk_detach (uptr); /* report error now */ + return r; + } } } uptr->flags = uptr->flags | UNIT_ATT; @@ -2468,9 +2474,11 @@ filesystem_size = get_filesystem_size (uptr); container_size = size_function (uptr->fileref); current_unit_size = ((t_offset)uptr->capac)*ctx->capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1); if (container_size && (container_size != (t_offset)-1)) { - if (dontautosize) { + if (dontchangecapac) { t_addr saved_capac = uptr->capac; + if (filesystem_size == (t_offset)-1) /* No file system found? */ + filesystem_size = container_size; /* Assume full container */ if (filesystem_size != (t_offset)-1) { const char *drive_type = NULL; @@ -2610,22 +2618,43 @@ static struct example_fields { const char *dsize3; const char *dtype4; const char *dsize4; - } ex_data[2] = { - {"RQ", "RD54", "159MB", "RX50", "409KB", "RA81", "456MB", "RA92", "1505MB"}, - {"RP", "autosize", "39MW", "autosize", "39MW", "RP07", "110MW", "RM03", "15MW"}, + } ex_data[] = { + {"RQ", "RD54", "159MB", "RX50", "409KB", "RA81", "456MB", "RA92", "1505MB"}, + {"RP", "RM03", "33MW", "RM03", "33MW", "RP07", "258MW", "RM03", "15MW"}, + {"RP", "RM03", "39MW", "RM03", "39MW", "RP07", "110MW", "RM03", "15MW"}, }; struct example_fields *ex = &ex_data[0]; +if (strcmp (dptr->name, "RP") == 0) + ex = &ex_data[1]; +if (strstr (sim_name, "-10")) { + ex = &ex_data[2]; + if (strstr (sim_name, "PDP") == NULL) + ex->dname = "RPA"; + } + fprintf (st, "%s Disk Attach Help\n\n", dptr->name); -fprintf (st, "Disk container files can be one of 3 different types:\n\n"); -fprintf (st, " SIMH A disk is an unstructured binary file of the size appropriate\n"); -fprintf (st, " for the disk drive being simulated\n"); -fprintf (st, " VHD Virtual Disk format which is described in the \"Microsoft\n"); -fprintf (st, " Virtual Hard Disk (VHD) Image Format Specification\". The\n"); -fprintf (st, " VHD implementation includes support for 1) Fixed (Preallocated)\n"); -fprintf (st, " disks, 2) Dynamically Expanding disks, and 3) Differencing disks.\n"); -fprintf (st, " RAW platform specific access to physical disk or CDROM drives\n\n"); +fprintf (st, "Disk container files can be one of several different types:\n\n"); +if (strstr (sim_name, "-10") == NULL) { + fprintf (st, " SIMH A disk is an unstructured binary file of the size appropriate\n"); + fprintf (st, " for the disk drive being simulated accessed by C runtime APIs\n"); + fprintf (st, " VHD Virtual Disk format which is described in the \"Microsoft\n"); + fprintf (st, " Virtual Hard Disk (VHD) Image Format Specification\". The\n"); + fprintf (st, " VHD implementation includes support for 1) Fixed (Preallocated)\n"); + fprintf (st, " disks, 2) Dynamically Expanding disks, and 3) Differencing disks.\n"); + fprintf (st, " RAW platform specific access to physical disk or CDROM drives\n\n"); + } +else { + fprintf (st, " SIMH A disk is an unstructured binary file of 64bit integers\n" + " access by C runtime APIs\n"); + fprintf (st, " VHD A disk is an unstructured binary file of 64bit integers\n" + " contained in a VHD container\n"); + fprintf (st, " RAW A disk is an unstructured binary file of 64bit integers\n" + " accessed by direct read/write APIs\n"); + fprintf (st, " DBD9 Compatible with KLH10 is a packed big endian word\n"); + fprintf (st, " DLD9 Compatible with KLH10 is a packed little endian word\n\n"); + } fprintf (st, "Virtual (VHD) Disks supported conform to \"Virtual Hard Disk Image Format\n"); fprintf (st, "Specification\", Version 1.0 October 11, 2006.\n"); fprintf (st, "Dynamically expanding disks never change their \"Virtual Size\", but they don't\n"); @@ -2692,23 +2721,17 @@ fprintf (st, " -M Merge a Differencing VHD into its parent VHD disk\ fprintf (st, " -O Override consistency checks when attaching differencing disks\n"); fprintf (st, " which have unexpected parent disk GUID or timestamps\n\n"); fprintf (st, " -U Fix inconsistencies which are overridden by the -O switch\n"); -if (strstr (sim_name, "PDP10") == NULL) { +if (strstr (sim_name, "-10") == NULL) { fprintf (st, " -Y Answer Yes to prompt to overwrite last track (on disk create)\n"); fprintf (st, " -N Answer No to prompt to overwrite last track (on disk create)\n"); } -if (strstr (sim_name, "PDP10-")) { - ex = &ex_data[1]; - ex->dname = "RPA"; - } -if (strcmp (dptr->name, "RP") == 0) - ex = &ex_data[1]; fprintf (st, "Examples:\n"); fprintf (st, " sim> show %s\n", ex->dname); fprintf (st, " %s, address=20001468-2000146B*, no vector, 4 units\n", ex->dname); -fprintf (st, " %s0, %s, not attached, write enabled, %s, autosize, SIMH format\n", ex->dname, ex->dsize, ex->dtype); -fprintf (st, " %s1, %s, not attached, write enabled, %s, autosize, SIMH format\n", ex->dname, ex->dsize, ex->dtype); -fprintf (st, " %s2, %s, not attached, write enabled, %s, autosize, SIMH format\n", ex->dname, ex->dsize, ex->dtype); -fprintf (st, " %s3, %s, not attached, write enabled, %s, autosize, SIMH format\n", ex->dname, ex->dsize2, ex->dtype2); +fprintf (st, " %s0, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize, ex->dtype); +fprintf (st, " %s1, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize, ex->dtype); +fprintf (st, " %s2, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize, ex->dtype); +fprintf (st, " %s3, %s, not attached, write enabled, %s, autosize, AUTO detect format\n", ex->dname, ex->dsize2, ex->dtype2); fprintf (st, " sim> # attach an existing VHD and determine its size and type automatically\n"); fprintf (st, " sim> attach %s0 %s.vhd\n", ex->dname, ex->dtype3); fprintf (st, " sim> show %s0\n", ex->dname); @@ -2719,7 +2742,7 @@ fprintf (st, " sim> attach %s2 -f vhd %s.vhd\n", ex->dname, ex->dtype4); fprintf (st, " %s2: creating new file\n", ex->dname); fprintf (st, " sim> show %s2\n", ex->dname); fprintf (st, " %s2, %s, attached to %s.vhd, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize4, ex->dtype4, ex->dtype4); -fprintf (st, " sim> # examine the size consumed by the %s VHD file", ex->dsize4); +fprintf (st, " sim> # examine the size consumed by the %s VHD file\n", ex->dsize4); fprintf (st, " sim> dir %s.vhd\n", ex->dtype4); fprintf (st, " Directory of H:\\Data\n\n"); fprintf (st, " 04/14/2011 12:57 PM 5,120 %s.vhd\n", ex->dtype4); @@ -2728,15 +2751,15 @@ fprintf (st, " sim> # create a differencing vhd (%s-1-Diff.vhd) with %s.vhd as fprintf (st, " sim> attach %s3 -d %s-1-Diff.vhd %s.vhd\n", ex->dname, ex->dtype4, ex->dtype4); fprintf (st, " sim> # create a VHD (%s-1.vhd) which is a copy of an existing disk\n", ex->dtype4); fprintf (st, " sim> attach %s3 -c %s-1.vhd %s.vhd\n", ex->dname, ex->dtype4, ex->dtype4); -fprintf (st, " %s3: creating new virtual disk '%s-1.vhd'\n", ex->dname, ex->dsize4); +fprintf (st, " %s3: creating new virtual disk '%s-1.vhd'\n", ex->dname, ex->dtype4); fprintf (st, " %s3: Copied %s. 99%% complete.\n", ex->dname, ex->dsize4); fprintf (st, " %s3: Copied %s. Done.\n", ex->dname, ex->dsize4); fprintf (st, " sim> show %s3\n", ex->dname); -fprintf (st, " %s3, %s, attached to %s-1.vhd, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize3, ex->dtype3, ex->dtype3); -fprintf (st, " sim> dir %s*\n", ex->dtype3); +fprintf (st, " %s3, %s, attached to %s-1.vhd, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize4, ex->dtype4, ex->dtype4); +fprintf (st, " sim> dir %s*\n", ex->dtype4); fprintf (st, " Directory of H:\\Data\n\n"); -fprintf (st, " 04/14/2011 01:12 PM 5,120 %s-1.vhd\n", ex->dtype3); -fprintf (st, " 04/14/2011 12:58 PM 5,120 %s.vhd\n", ex->dtype3); +fprintf (st, " 04/14/2011 01:12 PM 5,120 %s-1.vhd\n", ex->dtype4); +fprintf (st, " 04/14/2011 12:58 PM 5,120 %s.vhd\n", ex->dtype4); fprintf (st, " 2 File(s) 10,240 bytes\n"); fprintf (st, " sim> show %s2\n", ex->dname); fprintf (st, " %s2, %s, not attached, write enabled, %s, autosize, VHD format\n", ex->dname, ex->dsize4, ex->dtype4); @@ -2907,37 +2930,6 @@ if (sim_deb && (dptr->dctrl & reason)) { } } -/* Guest specific Disk I/O support */ -#define PDP10_SECTORS 2 /* PDP-10 sectors are 1024 bytes */ - -t_stat sim_disk_pdp10_attach (UNIT *uptr, const char *cptr, t_bool dontautosize, - uint32 dbit, const char *dtype, int completion_delay, const char **drivetypes) -{ -return sim_disk_attach_ex (uptr, cptr, 512 * PDP10_SECTORS, sizeof (t_uint64), dontautosize, dbit, dtype, 0, completion_delay, drivetypes); -} - -t_stat sim_disk_pdp10_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) -{ -t_seccnt sectors; -t_stat r = sim_disk_rdsect (uptr, lba * PDP10_SECTORS, buf, §ors, sects * PDP10_SECTORS); - -if (sectsread) - *sectsread = sectors / PDP10_SECTORS; - -return r; -} - -t_stat sim_disk_pdp10_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) -{ -t_seccnt sectors; -t_stat r = sim_disk_wrsect (uptr, lba * PDP10_SECTORS, buf, §ors, sects * PDP10_SECTORS); - -if (sectswritten) - *sectswritten = sectors / PDP10_SECTORS; - -return r; -} - /* OS Specific RAW Disk I/O support */ #if defined _WIN32 @@ -3888,10 +3880,12 @@ typedef struct _VHD_Footer { name as a nul terminated string. */ uint8 DriveType[16]; + uint32 DriveSectorSize; + uint32 DriveTransferElementSize; /* - This field contains zeroes. It is 400 bytes in size. + This field contains zeroes. It is 392 bytes in size. */ - uint8 Reserved[400]; + uint8 Reserved[392]; } VHD_Footer; /* @@ -4361,13 +4355,15 @@ static t_stat sim_vhd_disk_implemented (void) return SCPE_OK; } -static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype) +static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype, uint32 SectorSize, uint32 xfer_element_size) { VHDHANDLE hVHD = (VHDHANDLE)f; int Status = 0; memset (hVHD->Footer.DriveType, '\0', sizeof hVHD->Footer.DriveType); memcpy (hVHD->Footer.DriveType, dtype, ((1+strlen (dtype)) < sizeof (hVHD->Footer.DriveType)) ? (1+strlen (dtype)) : sizeof (hVHD->Footer.DriveType)); +hVHD->Footer.DriveSectorSize = NtoHl (SectorSize); +hVHD->Footer.DriveTransferElementSize = NtoHl (xfer_element_size); hVHD->Footer.Checksum = 0; hVHD->Footer.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Footer, sizeof(hVHD->Footer))); @@ -4413,10 +4409,14 @@ if (Status) return SCPE_OK; } -static const char *sim_vhd_disk_get_dtype (FILE *f) +static const char *sim_vhd_disk_get_dtype (FILE *f, uint32 *SectorSize, uint32 *xfer_element_size) { VHDHANDLE hVHD = (VHDHANDLE)f; +if (SectorSize) + *SectorSize = NtoHl (hVHD->Footer.DriveSectorSize); +if (xfer_element_size) + *xfer_element_size = NtoHl (hVHD->Footer.DriveTransferElementSize); return (char *)(&hVHD->Footer.DriveType[0]); } @@ -5082,6 +5082,8 @@ hVHD->Dynamic.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Dynamic, size hVHD->Footer.Checksum = 0; hVHD->Footer.DiskType = NtoHl (VHD_DT_Differencing); memcpy (hVHD->Footer.DriveType, ParentFooter.DriveType, sizeof (hVHD->Footer.DriveType)); +hVHD->Footer.DriveSectorSize = ParentFooter.DriveSectorSize; +hVHD->Footer.DriveTransferElementSize = ParentFooter.DriveTransferElementSize; hVHD->Footer.Checksum = NtoHl (CalculateVhdFooterChecksum (&hVHD->Footer, sizeof(hVHD->Footer))); if (WriteFilePosition (hVHD->File, diff --git a/sim_disk.h b/sim_disk.h index e0a8db0d..4b2b9873 100644 --- a/sim_disk.h +++ b/sim_disk.h @@ -68,10 +68,25 @@ typedef void (*DISK_PCALLBACK)(UNIT *unit, t_stat status); /* Prototypes */ -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); -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_attach (UNIT *uptr, + const char *cptr, + size_t sector_size, size_t xfer_element_size, + t_bool dontchangecapac, + 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 dontchangecapac, /* if false just change uptr->capac as needed */ + uint32 dbit, /* debug bit */ + const char *dtype, /* drive type */ + uint32 pdp11tracksize, /* BAD144 track */ + int completion_delay, /* Minimum Delay for asynch I/O completion */ + const char **drivetypes); /* list of drive types (from smallest to largest) */ + /* to try and fit the container/file system into */ 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_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); @@ -97,10 +112,6 @@ t_bool sim_disk_vhd_support (void); t_bool sim_disk_raw_support (void); void sim_disk_data_trace (UNIT *uptr, const uint8 *data, size_t lba, size_t len, const char* txt, int detail, uint32 reason); t_stat sim_disk_test (DEVICE *dptr); -t_stat sim_disk_pdp10_attach (UNIT *uptr, const char *cptr, t_bool dontautosize, uint32 dbit, - const char *dtype, int completion_delay, const char **drivetypes); -t_stat sim_disk_pdp10_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); -t_stat sim_disk_pdp10_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); #ifdef __cplusplus }