diff --git a/PDP11/pdp11_dz.c b/PDP11/pdp11_dz.c index eb57579f..441e1201 100644 --- a/PDP11/pdp11_dz.c +++ b/PDP11/pdp11_dz.c @@ -903,7 +903,8 @@ fprintf (st, " sim> SHOW %s CONNECTIONS show current connections\n", dptr->n fprintf (st, " sim> SHOW %s STATISTICS show statistics for active connections\n", dptr->name); fprintf (st, " sim> SET %s DISCONNECT=linenumber disconnects the specified line.\n\n\n", dptr->name); fprintf (st, "All open connections are lost when the simulator shuts down or the %s is\n", dptr->name); -fprintf (st, "detached.\n"); +fprintf (st, "detached.\n\n"); +dz_help_attach (st, dptr, uptr, flag, cptr); return SCPE_OK; } diff --git a/PDP11/pdp11_rq.c b/PDP11/pdp11_rq.c index 7c6b707b..69dd60ba 100644 --- a/PDP11/pdp11_rq.c +++ b/PDP11/pdp11_rq.c @@ -798,6 +798,7 @@ t_stat rq_show_ctype (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat rq_show_wlk (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat rq_show_ctrl (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat rq_show_unitq (FILE *st, UNIT *uptr, int32 val, void *desc); +t_stat rq_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); char *rq_description (DEVICE *dptr); t_bool rq_step4 (MSC *cp); @@ -873,45 +874,44 @@ UNIT rq_unit[] = { }; REG rq_reg[] = { - { GRDATA (UBASE, rq_ctx.ubase, DEV_RDX, 8, 0), REG_RO }, - { GRDATA (SA, rq_ctx.sa, DEV_RDX, 16, 0) }, - { GRDATA (SAW, rq_ctx.saw, DEV_RDX, 16, 0) }, - { GRDATA (S1DAT, rq_ctx.s1dat, DEV_RDX, 16, 0) }, - { GRDATA (COMM, rq_ctx.comm, DEV_RDX, 22, 0) }, - { GRDATA (CQIOFF, rq_ctx.cq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (CQBA, rq_ctx.cq.ba, DEV_RDX, 22, 0) }, - { GRDATA (CQLNT, rq_ctx.cq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (CQIDX, rq_ctx.cq.idx, DEV_RDX, 8, 2) }, - { GRDATA (RQIOFF, rq_ctx.rq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (RQBA, rq_ctx.rq.ba, DEV_RDX, 22, 0) }, - { GRDATA (RQLNT, rq_ctx.rq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (RQIDX, rq_ctx.rq.idx, DEV_RDX, 8, 2) }, - { DRDATA (FREE, rq_ctx.freq, 5) }, - { DRDATA (RESP, rq_ctx.rspq, 5) }, - { DRDATA (PBSY, rq_ctx.pbsy, 5) }, - { GRDATA (CFLGS, rq_ctx.cflgs, DEV_RDX, 16, 0) }, - { GRDATA (CSTA, rq_ctx.csta, DEV_RDX, 4, 0) }, - { GRDATA (PERR, rq_ctx.perr, DEV_RDX, 9, 0) }, - { DRDATA (CRED, rq_ctx.credits, 5) }, - { DRDATA (HAT, rq_ctx.hat, 17) }, - { DRDATA (HTMO, rq_ctx.htmo, 17) }, - { FLDATA (PRGI, rq_ctx.prgi, 0), REG_HIDDEN }, - { FLDATA (PIP, rq_ctx.pip, 0), REG_HIDDEN }, - { FLDATA (CTYPE, rq_ctx.ctype, 32), REG_HIDDEN }, - { DRDATA (ITIME, rq_itime, 24), PV_LEFT + REG_NZ }, - { DRDATA (ITIME, rq_itime, 24), PV_LEFT + REG_NZ }, - { DRDATA (I4TIME, rq_itime4, 24), PV_LEFT + REG_NZ }, - { DRDATA (QTIME, rq_qtime, 24), PV_LEFT + REG_NZ }, - { DRDATA (XTIME, rq_xtime, 24), PV_LEFT + REG_NZ }, - { BRDATA (PKTS, rq_ctx.pak, DEV_RDX, 16, sizeof(rq_ctx.pak)/2) }, - { URDATA (CPKT, rq_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UCNUM, rq_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (PKTQ, rq_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UFLG, rq_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0) }, - { URDATA (CAPAC, rq_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, - { GRDATA (DEVADDR, rq_dib.ba, DEV_RDX, 32, 0), REG_HRO }, - { GRDATA (DEVVEC, rq_dib.vec, DEV_RDX, 16, 0), REG_HRO }, - { DRDATA (DEVLBN, drv_tab[RA8U_DTYPE].lbn, 22), REG_HRO }, + { GRDATAD (UBASE, rq_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO }, + { GRDATAD (SA, rq_ctx.sa, DEV_RDX, 16, 0, "status/address register") }, + { GRDATAD (SAW, rq_ctx.saw, DEV_RDX, 16, 0, "written data") }, + { GRDATAD (S1DAT, rq_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") }, + { GRDATAD (COMM, rq_ctx.comm, DEV_RDX, 22, 0, "comm region") }, + { GRDATAD (CQIOFF, rq_ctx.cq.ioff, DEV_RDX, 32, 0, "command queue intr offset") }, + { GRDATAD (CQBA, rq_ctx.cq.ba, DEV_RDX, 22, 0, "command queue base address") }, + { GRDATAD (CQLNT, rq_ctx.cq.lnt, DEV_RDX, 32, 2, "command queue length"), REG_NZ }, + { GRDATAD (CQIDX, rq_ctx.cq.idx, DEV_RDX, 8, 2, "command queue index") }, + { GRDATAD (RQIOFF, rq_ctx.rq.ioff, DEV_RDX, 32, 0, "request queue intr offset") }, + { GRDATAD (RQBA, rq_ctx.rq.ba, DEV_RDX, 22, 0, "request queue base address") }, + { GRDATAD (RQLNT, rq_ctx.rq.lnt, DEV_RDX, 32, 2, "request queue length"), REG_NZ }, + { GRDATAD (RQIDX, rq_ctx.rq.idx, DEV_RDX, 8, 2, "request queue index") }, + { DRDATAD (FREE, rq_ctx.freq, 5, "head of free packet list") }, + { DRDATAD (RESP, rq_ctx.rspq, 5, "head of response packet list") }, + { DRDATAD (PBSY, rq_ctx.pbsy, 5, "number of busy packets") }, + { GRDATAD (CFLGS, rq_ctx.cflgs, DEV_RDX, 16, 0, "controller flags") }, + { GRDATAD (CSTA, rq_ctx.csta, DEV_RDX, 4, 0, "controller state") }, + { GRDATAD (PERR, rq_ctx.perr, DEV_RDX, 9, 0, "port error number") }, + { DRDATAD (CRED, rq_ctx.credits, 5, "host credits") }, + { DRDATAD (HAT, rq_ctx.hat, 17, "host available timer") }, + { DRDATAD (HTMO, rq_ctx.htmo, 17, "host timeout value") }, + { FLDATA (PRGI, rq_ctx.prgi, 0), REG_HIDDEN }, + { FLDATA (PIP, rq_ctx.pip, 0), REG_HIDDEN }, + { FLDATA (CTYPE, rq_ctx.ctype, 32), REG_HIDDEN }, + { DRDATAD (ITIME, rq_itime, 24, "init time delay, except stage 4"), PV_LEFT + REG_NZ }, + { DRDATAD (I4TIME, rq_itime4, 24, "init stage 4 delay"), PV_LEFT + REG_NZ }, + { DRDATAD (QTIME, rq_qtime, 24, "response time for 'immediate' packets"), PV_LEFT + REG_NZ }, + { DRDATAD (XTIME, rq_xtime, 24, "response time for data transfers"), PV_LEFT + REG_NZ }, + { BRDATAD (PKTS, rq_ctx.pak, DEV_RDX, 16, sizeof(rq_ctx.pak)/2, "packet buffers, 33W each, 32 entries") }, + { URDATAD (CPKT, rq_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0, "current packet, units 0 to 3") }, + { URDATAD (UCNUM, rq_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0, "ctrl number, units 0 to 3") }, + { URDATAD (PKTQ, rq_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") }, + { URDATAD (UFLG, rq_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") }, + { URDATA (CAPAC, rq_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, + { GRDATA (DEVADDR, rq_dib.ba, DEV_RDX, 32, 0), REG_HRO }, + { GRDATA (DEVVEC, rq_dib.vec, DEV_RDX, 16, 0), REG_HRO }, + { DRDATA (DEVLBN, drv_tab[RA8U_DTYPE].lbn, 22), REG_HRO }, { NULL } }; @@ -932,14 +932,14 @@ MTAB rq_mod[] = { NULL, &rq_show_ctrl, NULL, "Display all unit queues" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO, RQ_SH_ALL, "ALL", NULL, NULL, &rq_show_ctrl, NULL, "Display complete controller state" }, + { MTAB_XTD|MTAB_VDV, RQDX3_CTYPE, NULL, "RQDX3", + &rq_set_ctype, NULL, NULL, "Set RQDX3 Controller Type" }, + { MTAB_XTD|MTAB_VDV, UDA50_CTYPE, NULL, "UDA50", + &rq_set_ctype, NULL, NULL, "Set UDA50 Controller Type" }, { MTAB_XTD|MTAB_VDV, KLESI_CTYPE, NULL, "KLESI", &rq_set_ctype, NULL, NULL, "Set KLESI Controller Type" }, { MTAB_XTD|MTAB_VDV, RUX50_CTYPE, NULL, "RUX50", &rq_set_ctype, NULL, NULL, "Set RUX50 Controller Type" }, - { MTAB_XTD|MTAB_VDV, UDA50_CTYPE, NULL, "UDA50", - &rq_set_ctype, NULL, NULL, "Set UDA50 Controller Type" }, - { MTAB_XTD|MTAB_VDV, RQDX3_CTYPE, NULL, "RQDX3", - &rq_set_ctype, NULL, NULL, "Set RQDX3 Controller Type" }, { MTAB_XTD|MTAB_VUN|MTAB_NMO, 0, "UNITQ", NULL, NULL, &rq_show_unitq, NULL, "Display unit queue" }, { MTAB_XTD|MTAB_VUN, RX50_DTYPE, NULL, "RX50", @@ -1012,7 +1012,7 @@ DEVICE rq_dev = { NULL, NULL, &rq_reset, &rq_boot, &rq_attach, &rq_detach, &rq_dib, DEV_DISABLE | DEV_UBUS | DEV_QBUS | DEV_DEBUG | DEV_DISK, - 0, rq_debug, NULL, NULL, NULL, NULL, NULL, + 0, rq_debug, NULL, NULL, &rq_help, NULL, NULL, &rq_description }; @@ -1045,39 +1045,39 @@ UNIT rqb_unit[] = { }; REG rqb_reg[] = { - { GRDATA (UBASE, rqb_ctx.ubase, DEV_RDX, 8, 0), REG_RO }, - { GRDATA (SA, rqb_ctx.sa, DEV_RDX, 16, 0) }, - { GRDATA (SAW, rqb_ctx.saw, DEV_RDX, 16, 0) }, - { GRDATA (S1DAT, rqb_ctx.s1dat, DEV_RDX, 16, 0) }, - { GRDATA (COMM, rqb_ctx.comm, DEV_RDX, 22, 0) }, - { GRDATA (CQIOFF, rqb_ctx.cq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (CQBA, rqb_ctx.cq.ba, DEV_RDX, 22, 0) }, - { GRDATA (CQLNT, rqb_ctx.cq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (CQIDX, rqb_ctx.cq.idx, DEV_RDX, 8, 2) }, - { GRDATA (RQIOFF, rqb_ctx.rq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (RQBA, rqb_ctx.rq.ba, DEV_RDX, 22, 0) }, - { GRDATA (RQLNT, rqb_ctx.rq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (RQIDX, rqb_ctx.rq.idx, DEV_RDX, 8, 2) }, - { DRDATA (FREE, rqb_ctx.freq, 5) }, - { DRDATA (RESP, rqb_ctx.rspq, 5) }, - { DRDATA (PBSY, rqb_ctx.pbsy, 5) }, - { GRDATA (CFLGS, rqb_ctx.cflgs, DEV_RDX, 16, 0) }, - { GRDATA (CSTA, rqb_ctx.csta, DEV_RDX, 4, 0) }, - { GRDATA (PERR, rqb_ctx.perr, DEV_RDX, 9, 0) }, - { DRDATA (CRED, rqb_ctx.credits, 5) }, - { DRDATA (HAT, rqb_ctx.hat, 17) }, - { DRDATA (HTMO, rqb_ctx.htmo, 17) }, - { FLDATA (PRGI, rqb_ctx.prgi, 0), REG_HIDDEN }, - { FLDATA (PIP, rqb_ctx.pip, 0), REG_HIDDEN }, - { FLDATA (CTYPE, rqb_ctx.ctype, 32), REG_HIDDEN }, - { BRDATA (PKTS, rqb_ctx.pak, DEV_RDX, 16, sizeof(rqb_ctx.pak)/2) }, - { URDATA (CPKT, rqb_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UCNUM, rqb_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (PKTQ, rqb_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UFLG, rqb_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0) }, - { URDATA (CAPAC, rqb_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, - { GRDATA (DEVADDR, rqb_dib.ba, DEV_RDX, 32, 0), REG_HRO }, - { GRDATA (DEVVEC, rqb_dib.vec, DEV_RDX, 16, 0), REG_HRO }, + { GRDATAD (UBASE, rqb_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO }, + { GRDATAD (SA, rqb_ctx.sa, DEV_RDX, 16, 0, "status/address register") }, + { GRDATAD (SAW, rqb_ctx.saw, DEV_RDX, 16, 0, "written data") }, + { GRDATAD (S1DAT, rqb_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") }, + { GRDATAD (COMM, rqb_ctx.comm, DEV_RDX, 22, 0, "comm region") }, + { GRDATAD (CQIOFF, rqb_ctx.cq.ioff, DEV_RDX, 32, 0, "command queue intr offset") }, + { GRDATAD (CQBA, rqb_ctx.cq.ba, DEV_RDX, 22, 0, "command queue base address") }, + { GRDATAD (CQLNT, rqb_ctx.cq.lnt, DEV_RDX, 32, 2, "command queue length"), REG_NZ }, + { GRDATAD (CQIDX, rqb_ctx.cq.idx, DEV_RDX, 8, 2, "command queue index") }, + { GRDATAD (RQIOFF, rqb_ctx.rq.ioff, DEV_RDX, 32, 0, "request queue intr offset") }, + { GRDATAD (RQBA, rqb_ctx.rq.ba, DEV_RDX, 22, 0, "request queue base address") }, + { GRDATAD (RQLNT, rqb_ctx.rq.lnt, DEV_RDX, 32, 2, "request queue length"), REG_NZ }, + { GRDATAD (RQIDX, rqb_ctx.rq.idx, DEV_RDX, 8, 2, "request queue index") }, + { DRDATAD (FREE, rqb_ctx.freq, 5, "head of free packet list") }, + { DRDATAD (RESP, rqb_ctx.rspq, 5, "head of response packet list") }, + { DRDATAD (PBSY, rqb_ctx.pbsy, 5, "number of busy packets") }, + { GRDATAD (CFLGS, rqb_ctx.cflgs, DEV_RDX, 16, 0, "controller flags") }, + { GRDATAD (CSTA, rqb_ctx.csta, DEV_RDX, 4, 0, "controller state") }, + { GRDATAD (PERR, rqb_ctx.perr, DEV_RDX, 9, 0, "port error number") }, + { DRDATAD (CRED, rqb_ctx.credits, 5, "host credits") }, + { DRDATAD (HAT, rqb_ctx.hat, 17, "host available timer") }, + { DRDATAD (HTMO, rqb_ctx.htmo, 17, "host timeout value") }, + { FLDATA (PRGI, rqb_ctx.prgi, 0), REG_HIDDEN }, + { FLDATA (PIP, rqb_ctx.pip, 0), REG_HIDDEN }, + { FLDATA (CTYPE, rqb_ctx.ctype, 32), REG_HIDDEN }, + { BRDATAD (PKTS, rqb_ctx.pak, DEV_RDX, 16, sizeof(rq_ctx.pak)/2, "packet buffers, 33W each, 32 entries") }, + { URDATAD (CPKT, rqb_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0, "current packet, units 0 to 3") }, + { URDATAD (UCNUM, rqb_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0, "ctrl number, units 0 to 3") }, + { URDATAD (PKTQ, rqb_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") }, + { URDATAD (UFLG, rqb_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") }, + { URDATA (CAPAC, rqb_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, + { GRDATA (DEVADDR, rqb_dib.ba, DEV_RDX, 32, 0), REG_HRO }, + { GRDATA (DEVVEC, rqb_dib.vec, DEV_RDX, 16, 0), REG_HRO }, { NULL } }; @@ -1087,7 +1087,7 @@ DEVICE rqb_dev = { NULL, NULL, &rq_reset, &rq_boot, &rq_attach, &rq_detach, &rqb_dib, DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_QBUS | DEV_DEBUG | DEV_DISK, - 0, rq_debug, NULL, NULL, NULL, NULL, NULL, + 0, rq_debug, NULL, NULL, &rq_help, NULL, NULL, &rq_description }; @@ -1120,39 +1120,39 @@ UNIT rqc_unit[] = { }; REG rqc_reg[] = { - { GRDATA (UBASE, rqc_ctx.ubase, DEV_RDX, 8, 0), REG_RO }, - { GRDATA (SA, rqc_ctx.sa, DEV_RDX, 16, 0) }, - { GRDATA (SAW, rqc_ctx.saw, DEV_RDX, 16, 0) }, - { GRDATA (S1DAT, rqc_ctx.s1dat, DEV_RDX, 16, 0) }, - { GRDATA (COMM, rqc_ctx.comm, DEV_RDX, 22, 0) }, - { GRDATA (CQIOFF, rqc_ctx.cq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (CQBA, rqc_ctx.cq.ba, DEV_RDX, 22, 0) }, - { GRDATA (CQLNT, rqc_ctx.cq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (CQIDX, rqc_ctx.cq.idx, DEV_RDX, 8, 2) }, - { GRDATA (RQIOFF, rqc_ctx.rq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (RQBA, rqc_ctx.rq.ba, DEV_RDX, 22, 0) }, - { GRDATA (RQLNT, rqc_ctx.rq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (RQIDX, rqc_ctx.rq.idx, DEV_RDX, 8, 2) }, - { DRDATA (FREE, rqc_ctx.freq, 5) }, - { DRDATA (RESP, rqc_ctx.rspq, 5) }, - { DRDATA (PBSY, rqc_ctx.pbsy, 5) }, - { GRDATA (CFLGS, rqc_ctx.cflgs, DEV_RDX, 16, 0) }, - { GRDATA (CSTA, rqc_ctx.csta, DEV_RDX, 4, 0) }, - { GRDATA (PERR, rqc_ctx.perr, DEV_RDX, 9, 0) }, - { DRDATA (CRED, rqc_ctx.credits, 5) }, - { DRDATA (HAT, rqc_ctx.hat, 17) }, - { DRDATA (HTMO, rqc_ctx.htmo, 17) }, - { FLDATA (PRGI, rqc_ctx.prgi, 0), REG_HIDDEN }, - { FLDATA (PIP, rqc_ctx.pip, 0), REG_HIDDEN }, - { FLDATA (CTYPE, rqc_ctx.ctype, 32), REG_HIDDEN }, - { BRDATA (PKTS, rqc_ctx.pak, DEV_RDX, 16, sizeof(rqc_ctx.pak)/2) }, - { URDATA (CPKT, rqc_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UCNUM, rqc_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (PKTQ, rqc_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UFLG, rqc_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0) }, - { URDATA (CAPAC, rqc_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, - { GRDATA (DEVADDR, rqc_dib.ba, DEV_RDX, 32, 0), REG_HRO }, - { GRDATA (DEVVEC, rqc_dib.vec, DEV_RDX, 16, 0), REG_HRO }, + { GRDATAD (UBASE, rqc_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO }, + { GRDATAD (SA, rqc_ctx.sa, DEV_RDX, 16, 0, "status/address register") }, + { GRDATAD (SAW, rqc_ctx.saw, DEV_RDX, 16, 0, "written data") }, + { GRDATAD (S1DAT, rqc_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") }, + { GRDATAD (COMM, rqc_ctx.comm, DEV_RDX, 22, 0, "comm region") }, + { GRDATAD (CQIOFF, rqc_ctx.cq.ioff, DEV_RDX, 32, 0, "command queue intr offset") }, + { GRDATAD (CQBA, rqc_ctx.cq.ba, DEV_RDX, 22, 0, "command queue base address") }, + { GRDATAD (CQLNT, rqc_ctx.cq.lnt, DEV_RDX, 32, 2, "command queue length"), REG_NZ }, + { GRDATAD (CQIDX, rqc_ctx.cq.idx, DEV_RDX, 8, 2, "command queue index") }, + { GRDATAD (RQIOFF, rqc_ctx.rq.ioff, DEV_RDX, 32, 0, "request queue intr offset") }, + { GRDATAD (RQBA, rqc_ctx.rq.ba, DEV_RDX, 22, 0, "request queue base address") }, + { GRDATAD (RQLNT, rqc_ctx.rq.lnt, DEV_RDX, 32, 2, "request queue length"), REG_NZ }, + { GRDATAD (RQIDX, rqc_ctx.rq.idx, DEV_RDX, 8, 2, "request queue index") }, + { DRDATAD (FREE, rqc_ctx.freq, 5, "head of free packet list") }, + { DRDATAD (RESP, rqc_ctx.rspq, 5, "head of response packet list") }, + { DRDATAD (PBSY, rqc_ctx.pbsy, 5, "number of busy packets") }, + { GRDATAD (CFLGS, rqc_ctx.cflgs, DEV_RDX, 16, 0, "controller flags") }, + { GRDATAD (CSTA, rqc_ctx.csta, DEV_RDX, 4, 0, "controller state") }, + { GRDATAD (PERR, rqc_ctx.perr, DEV_RDX, 9, 0, "port error number") }, + { DRDATAD (CRED, rqc_ctx.credits, 5, "host credits") }, + { DRDATAD (HAT, rqc_ctx.hat, 17, "host available timer") }, + { DRDATAD (HTMO, rqc_ctx.htmo, 17, "host timeout value") }, + { FLDATA (PRGI, rqc_ctx.prgi, 0), REG_HIDDEN }, + { FLDATA (PIP, rqc_ctx.pip, 0), REG_HIDDEN }, + { FLDATA (CTYPE, rqc_ctx.ctype, 32), REG_HIDDEN }, + { BRDATAD (PKTS, rqc_ctx.pak, DEV_RDX, 16, sizeof(rq_ctx.pak)/2, "packet buffers, 33W each, 32 entries") }, + { URDATAD (CPKT, rqc_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0, "current packet, units 0 to 3") }, + { URDATAD (UCNUM, rqc_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0, "ctrl number, units 0 to 3") }, + { URDATAD (PKTQ, rqc_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") }, + { URDATAD (UFLG, rqc_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") }, + { URDATA (CAPAC, rqc_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, + { GRDATA (DEVADDR, rqc_dib.ba, DEV_RDX, 32, 0), REG_HRO }, + { GRDATA (DEVVEC, rqc_dib.vec, DEV_RDX, 16, 0), REG_HRO }, { NULL } }; @@ -1162,7 +1162,7 @@ DEVICE rqc_dev = { NULL, NULL, &rq_reset, &rq_boot, &rq_attach, &rq_detach, &rqc_dib, DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_QBUS | DEV_DEBUG | DEV_DISK, - 0, rq_debug, NULL, NULL, NULL, NULL, NULL, + 0, rq_debug, NULL, NULL, &rq_help, NULL, NULL, &rq_description }; @@ -1195,39 +1195,39 @@ UNIT rqd_unit[] = { }; REG rqd_reg[] = { - { GRDATA (UBASE, rqd_ctx.ubase, DEV_RDX, 8, 0), REG_RO }, - { GRDATA (SA, rqd_ctx.sa, DEV_RDX, 16, 0) }, - { GRDATA (SAW, rqd_ctx.saw, DEV_RDX, 16, 0) }, - { GRDATA (S1DAT, rqd_ctx.s1dat, DEV_RDX, 16, 0) }, - { GRDATA (COMM, rqd_ctx.comm, DEV_RDX, 22, 0) }, - { GRDATA (CQIOFF, rqd_ctx.cq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (CQBA, rqd_ctx.cq.ba, DEV_RDX, 22, 0) }, - { GRDATA (CQLNT, rqd_ctx.cq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (CQIDX, rqd_ctx.cq.idx, DEV_RDX, 8, 2) }, - { GRDATA (RQIOFF, rqd_ctx.rq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (RQBA, rqd_ctx.rq.ba, DEV_RDX, 22, 0) }, - { GRDATA (RQLNT, rqd_ctx.rq.lnt, DEV_RDX, 32, 2), REG_NZ }, - { GRDATA (RQIDX, rqd_ctx.rq.idx, DEV_RDX, 8, 2) }, - { DRDATA (FREE, rqd_ctx.freq, 5) }, - { DRDATA (RESP, rqd_ctx.rspq, 5) }, - { DRDATA (PBSY, rqd_ctx.pbsy, 5) }, - { GRDATA (CFLGS, rqd_ctx.cflgs, DEV_RDX, 16, 0) }, - { GRDATA (CSTA, rqd_ctx.csta, DEV_RDX, 4, 0) }, - { GRDATA (PERR, rqd_ctx.perr, DEV_RDX, 9, 0) }, - { DRDATA (CRED, rqd_ctx.credits, 5) }, - { DRDATA (HAT, rqd_ctx.hat, 17) }, - { DRDATA (HTMO, rqd_ctx.htmo, 17) }, - { FLDATA (PRGI, rqd_ctx.prgi, 0), REG_HIDDEN }, - { FLDATA (PIP, rqd_ctx.pip, 0), REG_HIDDEN }, - { FLDATA (CTYPE, rqd_ctx.ctype, 32), REG_HIDDEN }, - { BRDATA (PKTS, rqd_ctx.pak, DEV_RDX, 16, sizeof(rqd_ctx.pak)/2) }, - { URDATA (CPKT, rqd_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UCNUM, rqd_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (PKTQ, rqd_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0) }, - { URDATA (UFLG, rqd_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0) }, - { URDATA (CAPAC, rqd_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, - { GRDATA (DEVADDR, rqd_dib.ba, DEV_RDX, 32, 0), REG_HRO }, - { GRDATA (DEVVEC, rqd_dib.vec, DEV_RDX, 16, 0), REG_HRO }, + { GRDATAD (UBASE, rqd_ctx.ubase, DEV_RDX, 8, 0, "unit base"), REG_RO }, + { GRDATAD (SA, rqd_ctx.sa, DEV_RDX, 16, 0, "status/address register") }, + { GRDATAD (SAW, rqd_ctx.saw, DEV_RDX, 16, 0, "written data") }, + { GRDATAD (S1DAT, rqd_ctx.s1dat, DEV_RDX, 16, 0, "step 1 init host data") }, + { GRDATAD (COMM, rqd_ctx.comm, DEV_RDX, 22, 0, "comm region") }, + { GRDATAD (CQIOFF, rqd_ctx.cq.ioff, DEV_RDX, 32, 0, "command queue intr offset") }, + { GRDATAD (CQBA, rqd_ctx.cq.ba, DEV_RDX, 22, 0, "command queue base address") }, + { GRDATAD (CQLNT, rqd_ctx.cq.lnt, DEV_RDX, 32, 2, "command queue length"), REG_NZ }, + { GRDATAD (CQIDX, rqd_ctx.cq.idx, DEV_RDX, 8, 2, "command queue index") }, + { GRDATAD (RQIOFF, rqd_ctx.rq.ioff, DEV_RDX, 32, 0, "request queue intr offset") }, + { GRDATAD (RQBA, rqd_ctx.rq.ba, DEV_RDX, 22, 0, "request queue base address") }, + { GRDATAD (RQLNT, rqd_ctx.rq.lnt, DEV_RDX, 32, 2, "request queue length"), REG_NZ }, + { GRDATAD (RQIDX, rqd_ctx.rq.idx, DEV_RDX, 8, 2, "request queue index") }, + { DRDATAD (FREE, rqd_ctx.freq, 5, "head of free packet list") }, + { DRDATAD (RESP, rqd_ctx.rspq, 5, "head of response packet list") }, + { DRDATAD (PBSY, rqd_ctx.pbsy, 5, "number of busy packets") }, + { GRDATAD (CFLGS, rqd_ctx.cflgs, DEV_RDX, 16, 0, "controller flags") }, + { GRDATAD (CSTA, rqd_ctx.csta, DEV_RDX, 4, 0, "controller state") }, + { GRDATAD (PERR, rqd_ctx.perr, DEV_RDX, 9, 0, "port error number") }, + { DRDATAD (CRED, rqd_ctx.credits, 5, "host credits") }, + { DRDATAD (HAT, rqd_ctx.hat, 17, "host available timer") }, + { DRDATAD (HTMO, rqd_ctx.htmo, 17, "host timeout value") }, + { FLDATA (PRGI, rqd_ctx.prgi, 0), REG_HIDDEN }, + { FLDATA (PIP, rqd_ctx.pip, 0), REG_HIDDEN }, + { FLDATA (CTYPE, rqd_ctx.ctype, 32), REG_HIDDEN }, + { BRDATAD (PKTS, rqd_ctx.pak, DEV_RDX, 16, sizeof(rq_ctx.pak)/2, "packet buffers, 33W each, 32 entries") }, + { URDATAD (CPKT, rqd_unit[0].cpkt, 10, 5, 0, RQ_NUMDR, 0, "current packet, units 0 to 3") }, + { URDATAD (UCNUM, rqd_unit[0].cnum, 10, 5, 0, RQ_NUMDR, 0, "ctrl number, units 0 to 3") }, + { URDATAD (PKTQ, rqd_unit[0].pktq, 10, 5, 0, RQ_NUMDR, 0, "packet queue, units 0 to 3") }, + { URDATAD (UFLG, rqd_unit[0].uf, DEV_RDX, 16, 0, RQ_NUMDR, 0, "unit flags, units 0 to 3") }, + { URDATA (CAPAC, rqd_unit[0].capac, 10, T_ADDR_W, 0, RQ_NUMDR, PV_LEFT | REG_HRO) }, + { GRDATA (DEVADDR, rqd_dib.ba, DEV_RDX, 32, 0), REG_HRO }, + { GRDATA (DEVVEC, rqd_dib.vec, DEV_RDX, 16, 0), REG_HRO }, { NULL } }; @@ -1237,7 +1237,7 @@ DEVICE rqd_dev = { NULL, NULL, &rq_reset, &rq_boot, &rq_attach, &rq_detach, &rqd_dib, DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_QBUS | DEV_DEBUG | DEV_DISK, - 0, rq_debug, NULL, NULL, NULL, NULL, NULL, + 0, rq_debug, NULL, NULL, &rq_help, NULL, NULL, &rq_description }; @@ -3082,6 +3082,40 @@ if (val & RQ_SH_UN) { return SCPE_OK; } +t_stat rq_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr) +{ +fprintf (st, "UDA50 MSCP Disk Controller (%s)\n\n", dptr->name); +fprintf (st, "The simulator implements four MSCP disk controllers, RQ, RQB, RQC, RQD.\n"); +fprintf (st, "Initially, RQB, RQC, and RQD are disabled. Each RQ controller simulates\n"); +fprintf (st, "an MSCP disk controller with four drives. The MSCP controller type can be\n"); +fprintf (st, "specified as one of RQDX3, UDA50, KLESI or RUX50. RQ options include the\n"); +fprintf (st, "ability to set units write enabled or write locked, and to set the drive\n"); +fprintf (st, "type to one of many disk types:\n"); +fprint_set_help (st, dptr); +fprintf (st, "set RQn RAUSER{=n} Set disk type to RA82 with n MB's\n"); +fprintf (st, "set -L RQn RAUSER{=n} Set disk type to RA82 with n LBN's\n\n"); +fprintf (st, "The type options can be used only when a unit is not attached to a file.\n"); +fprintf (st, "RAUSER is a \"user specified\" disk; the user can specify the size of the\n"); +fprintf (st, "disk in either MB (1000000 bytes) or logical block numbers (LBN's, 512 bytes\n"); +fprintf (st, "each). The minimum size is 5MB; the maximum size is 2GB without extended\n"); +fprintf (st, "file support, 1TB with extended file support.\n\n"); +fprintf (st, "The %s controllers support the BOOT command.\n\n", dptr->name); +fprint_show_help (st, dptr); +fprint_reg_help (st, dptr); +fprintf (st, "\nWhile VMS is not timing sensitive, most of the BSD-derived operating systems\n"); +fprintf (st, "(NetBSD, OpenBSD, etc) are. The QTIME and XTIME parameters are set to values\n"); +fprintf (st, "that allow these operating systems to run correctly.\n\n"); +fprintf (st, "\nError handling is as follows:\n\n"); +fprintf (st, " error processed as\n"); +fprintf (st, " not attached disk not ready\n"); +fprintf (st, " end of file assume rest of disk is zero\n"); +fprintf (st, " OS I/O error report error and stop\n"); +fprintf (st, "\nDisk drives on the %s device can be attacbed to simulated storage in the\n"); +fprintf (st, "following ways:\n\n", dptr->name); +sim_disk_attach_help (st, dptr, uptr, flag, cptr); +return SCPE_OK; +} + char *rq_description (DEVICE *dptr) { static char buf[80]; diff --git a/PDP11/pdp11_tq.c b/PDP11/pdp11_tq.c index 90827081..159aa151 100644 --- a/PDP11/pdp11_tq.c +++ b/PDP11/pdp11_tq.c @@ -359,6 +359,7 @@ t_stat tq_show_ctrl (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat tq_show_unitq (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat tq_set_type (UNIT *uptr, int32 val, char *cptr, void *desc); t_stat tq_show_type (FILE *st, UNIT *uptr, int32 val, void *desc); +static t_stat tq_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); char *tq_description (DEVICE *dptr); t_bool tq_step4 (void); @@ -432,44 +433,44 @@ UNIT tq_unit[] = { #define TQ_QUEUE (TQ_TIMER + 1) REG tq_reg[] = { - { GRDATA (SA, tq_sa, DEV_RDX, 16, 0) }, - { GRDATA (SAW, tq_saw, DEV_RDX, 16, 0) }, - { GRDATA (S1DAT, tq_s1dat, DEV_RDX, 16, 0) }, - { GRDATA (CQIOFF, tq_cq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (CQBA, tq_cq.ba, DEV_RDX, 22, 0) }, - { GRDATA (CQLNT, tq_cq.lnt, DEV_RDX, 8, 2), REG_NZ }, - { GRDATA (CQIDX, tq_cq.idx, DEV_RDX, 8, 2) }, - { GRDATA (TQIOFF, tq_rq.ioff, DEV_RDX, 32, 0) }, - { GRDATA (TQBA, tq_rq.ba, DEV_RDX, 22, 0) }, - { GRDATA (TQLNT, tq_rq.lnt, DEV_RDX, 8, 2), REG_NZ }, - { GRDATA (TQIDX, tq_rq.idx, DEV_RDX, 8, 2) }, - { DRDATA (FREE, tq_freq, 5) }, - { DRDATA (RESP, tq_rspq, 5) }, - { DRDATA (PBSY, tq_pbsy, 5) }, - { GRDATA (CFLGS, tq_cflgs, DEV_RDX, 16, 0) }, - { GRDATA (CSTA, tq_csta, DEV_RDX, 4, 0) }, - { GRDATA (PERR, tq_perr, DEV_RDX, 9, 0) }, - { DRDATA (CRED, tq_credits, 5) }, - { DRDATA (HAT, tq_hat, 17) }, - { DRDATA (HTMO, tq_htmo, 17) }, - { URDATA (CPKT, tq_unit[0].cpkt, 10, 5, 0, TQ_NUMDR, 0) }, - { URDATA (PKTQ, tq_unit[0].pktq, 10, 5, 0, TQ_NUMDR, 0) }, - { URDATA (UFLG, tq_unit[0].uf, DEV_RDX, 16, 0, TQ_NUMDR, 0) }, - { URDATA (POS, tq_unit[0].pos, 10, T_ADDR_W, 0, TQ_NUMDR, 0) }, - { URDATA (OBJP, tq_unit[0].objp, 10, 32, 0, TQ_NUMDR, 0) }, - { FLDATA (PRGI, tq_prgi, 0), REG_HIDDEN }, - { FLDATA (PIP, tq_pip, 0), REG_HIDDEN }, - { FLDATA (INT, IREQ (TQ), INT_V_TQ) }, - { DRDATA (ITIME, tq_itime, 24), PV_LEFT + REG_NZ }, - { DRDATA (I4TIME, tq_itime4, 24), PV_LEFT + REG_NZ }, - { DRDATA (QTIME, tq_qtime, 24), PV_LEFT + REG_NZ }, - { DRDATA (XTIME, tq_xtime, 24), PV_LEFT + REG_NZ }, - { DRDATA (RWTIME, tq_rwtime, 32), PV_LEFT + REG_NZ }, - { BRDATA (PKTS, tq_pkt, DEV_RDX, 16, TQ_NPKTS * (TQ_PKT_SIZE_W + 1)) }, - { DRDATA (DEVTYPE, tq_typ, 2), REG_HRO }, - { DRDATA (DEVCAP, drv_tab[TQU_TYPE].cap, T_ADDR_W), PV_LEFT | REG_HRO }, - { GRDATA (DEVADDR, tq_dib.ba, DEV_RDX, 32, 0), REG_HRO }, - { GRDATA (DEVVEC, tq_dib.vec, DEV_RDX, 16, 0), REG_HRO }, + { GRDATAD (SA, tq_sa, DEV_RDX, 16, 0, "status/address register") }, + { GRDATAD (SAW, tq_saw, DEV_RDX, 16, 0, "written data") }, + { GRDATAD (S1DAT, tq_s1dat, DEV_RDX, 16, 0, "step 1 init host data") }, + { GRDATAD (CQIOFF, tq_cq.ioff, DEV_RDX, 32, 0, "command queue intr offset") }, + { GRDATAD (CQBA, tq_cq.ba, DEV_RDX, 22, 0, "command queue base address") }, + { GRDATAD (CQLNT, tq_cq.lnt, DEV_RDX, 8, 2, "command queue length"), REG_NZ }, + { GRDATAD (CQIDX, tq_cq.idx, DEV_RDX, 8, 2, "command queue index") }, + { GRDATAD (TQIOFF, tq_rq.ioff, DEV_RDX, 32, 0, "request queue intr offset") }, + { GRDATAD (TQBA, tq_rq.ba, DEV_RDX, 22, 0, "request queue base address") }, + { GRDATAD (TQLNT, tq_rq.lnt, DEV_RDX, 8, 2, "request queue length"), REG_NZ }, + { GRDATAD (TQIDX, tq_rq.idx, DEV_RDX, 8, 2, "request queue index") }, + { DRDATAD (FREE, tq_freq, 5, "head of free packet list") }, + { DRDATAD (RESP, tq_rspq, 5, "head of response packet list") }, + { DRDATAD (PBSY, tq_pbsy, 5, "number of busy packets") }, + { GRDATAD (CFLGS, tq_cflgs, DEV_RDX, 16, 0, "controller flags") }, + { GRDATAD (CSTA, tq_csta, DEV_RDX, 4, 0, "controller state") }, + { GRDATAD (PERR, tq_perr, DEV_RDX, 9, 0, "port error number") }, + { DRDATAD (CRED, tq_credits, 5, "host credits") }, + { DRDATAD (HAT, tq_hat, 17, "host available timer") }, + { DRDATAD (HTMO, tq_htmo, 17, "host timeout value") }, + { URDATAD (CPKT, tq_unit[0].cpkt, 10, 5, 0, TQ_NUMDR, 0, "current packet, units 0 to 3") }, + { URDATAD (PKTQ, tq_unit[0].pktq, 10, 5, 0, TQ_NUMDR, 0, "packet queue, units 0 to 3") }, + { URDATAD (UFLG, tq_unit[0].uf, DEV_RDX, 16, 0, TQ_NUMDR, 0, "unit flags, units 0 to 3") }, + { URDATAD (POS, tq_unit[0].pos, 10, T_ADDR_W, 0, TQ_NUMDR, 0, "position, units 0 to 3") }, + { URDATAD (OBJP, tq_unit[0].objp, 10, 32, 0, TQ_NUMDR, 0, "object position, units 0 to 3") }, + { FLDATA (PRGI, tq_prgi, 0), REG_HIDDEN }, + { FLDATA (PIP, tq_pip, 0), REG_HIDDEN }, + { FLDATAD (INT, IREQ (TQ), INT_V_TQ, "interrupt pending flag") }, + { DRDATAD (ITIME, tq_itime, 24, "init time delay, except stage 4"), PV_LEFT + REG_NZ }, + { DRDATAD (I4TIME, tq_itime4, 24, "init stage 4 delay"), PV_LEFT + REG_NZ }, + { DRDATAD (QTIME, tq_qtime, 24, "response time for 'immediate' packets"), PV_LEFT + REG_NZ }, + { DRDATAD (XTIME, tq_xtime, 24, "response time for data transfers"), PV_LEFT + REG_NZ }, + { DRDATAD (RWTIME, tq_rwtime, 32, "rewind time 2 sec (adjusted later)"), PV_LEFT + REG_NZ }, + { BRDATAD (PKTS, tq_pkt, DEV_RDX, 16, TQ_NPKTS * (TQ_PKT_SIZE_W + 1), "packet buffers, 33W each, 32 entries") }, + { DRDATA (DEVTYPE, tq_typ, 2), REG_HRO }, + { DRDATA (DEVCAP, drv_tab[TQU_TYPE].cap, T_ADDR_W), PV_LEFT | REG_HRO }, + { GRDATA (DEVADDR, tq_dib.ba, DEV_RDX, 32, 0), REG_HRO }, + { GRDATA (DEVVEC, tq_dib.vec, DEV_RDX, 16, 0), REG_HRO }, { NULL } }; @@ -543,7 +544,7 @@ DEVICE tq_dev = { &tq_boot, &tq_attach, &tq_detach, &tq_dib, DEV_DISABLE | DEV_UBUS | DEV_QBUS | DEV_DEBUG | DEV_TAPE, 0, tq_debug, - NULL, NULL, NULL, NULL, NULL, + NULL, NULL, &tq_help, NULL, NULL, &tq_description }; @@ -2385,6 +2386,27 @@ fprintf (st, "%s (%dMB)", drv_tab[tq_typ].name, (uint32) (drv_tab[tq_typ].cap >> return SCPE_OK; } +t_stat tq_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr) +{ +char *devtype = UNIBUS ? "TUK50" : "TQK50"; + +fprintf (st, "%s (TQ)\n\n", tq_description (dptr)); +fprintf (st, "The TQ controller simulates the %s TMSCP disk controller. TQ options\n", devtype); +fprintf (st, "include the ability to set units write enabled or write locked, and to\n"); +fprintf (st, "specify the controller type and tape length:\n"); +fprint_set_help (st, dptr); +fprintf (st, "\nThe %s device supports the BOOT command.\n", devtype); +fprint_show_help (st, dptr); +fprint_reg_help (st, dptr); +fprintf (st, "\nError handling is as follows:\n\n"); +fprintf (st, " error processed as\n"); +fprintf (st, " not attached tape not ready\n\n"); +fprintf (st, " end of file end of medium\n"); +fprintf (st, " OS I/O error fatal tape error\n\n"); +sim_tape_attach_help (st, dptr, uptr, flag, cptr); +return SCPE_OK; +} + char *tq_description (DEVICE *dptr) { return (UNIBUS) ? "TUK50 TMSCP magnetic tape controller" : diff --git a/PDP11/pdp11_ts.c b/PDP11/pdp11_ts.c index fd9f4028..f531f6ef 100644 --- a/PDP11/pdp11_ts.c +++ b/PDP11/pdp11_ts.c @@ -296,6 +296,7 @@ int32 ts_updxs0 (int32 t); void ts_cmpendcmd (int32 s0, int32 s1); void ts_endcmd (int32 ssf, int32 xs0f, int32 msg); int32 ts_map_status (t_stat st); +t_stat ts_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr); char *ts_description (DEVICE *dptr); /* TS data structures @@ -316,34 +317,34 @@ DIB ts_dib = { UNIT ts_unit = { UDATA (&ts_svc, UNIT_ATTABLE + UNIT_ROABLE + UNIT_DISABLE, 0) }; REG ts_reg[] = { - { GRDATA (TSSR, tssr, DEV_RDX, 16, 0) }, - { GRDATA (TSBA, tsba, DEV_RDX, 22, 0) }, - { GRDATA (TSDBX, tsdbx, DEV_RDX, 8, 0) }, - { GRDATA (CHDR, cmdhdr, DEV_RDX, 16, 0) }, - { GRDATA (CADL, cmdadl, DEV_RDX, 16, 0) }, - { GRDATA (CADH, cmdadh, DEV_RDX, 16, 0) }, - { GRDATA (CLNT, cmdlnt, DEV_RDX, 16, 0) }, - { GRDATA (MHDR, msghdr, DEV_RDX, 16, 0) }, - { GRDATA (MRFC, msgrfc, DEV_RDX, 16, 0) }, - { GRDATA (MXS0, msgxs0, DEV_RDX, 16, 0) }, - { GRDATA (MXS1, msgxs1, DEV_RDX, 16, 0) }, - { GRDATA (MXS2, msgxs2, DEV_RDX, 16, 0) }, - { GRDATA (MXS3, msgxs3, DEV_RDX, 16, 0) }, - { GRDATA (MSX4, msgxs4, DEV_RDX, 16, 0) }, - { GRDATA (WADL, wchadl, DEV_RDX, 16, 0) }, - { GRDATA (WADH, wchadh, DEV_RDX, 16, 0) }, - { GRDATA (WLNT, wchlnt, DEV_RDX, 16, 0) }, - { GRDATA (WOPT, wchopt, DEV_RDX, 16, 0) }, - { GRDATA (WXOPT, wchxopt, DEV_RDX, 16, 0) }, - { FLDATA (INT, IREQ (TS), INT_V_TS) }, - { FLDATA (ATTN, ts_qatn, 0) }, - { FLDATA (BOOT, ts_bcmd, 0) }, - { FLDATA (OWNC, ts_ownc, 0) }, - { FLDATA (OWNM, ts_ownm, 0) }, - { DRDATA (TIME, ts_time, 24), PV_LEFT + REG_NZ }, - { DRDATA (POS, ts_unit.pos, T_ADDR_W), PV_LEFT + REG_RO }, - { GRDATA (DEVADDR, ts_dib.ba, DEV_RDX, 32, 0), REG_HRO }, - { GRDATA (DEVVEC, ts_dib.vec, DEV_RDX, 16, 0), REG_HRO }, + { GRDATAD (TSSR, tssr, DEV_RDX, 16, 0, "status register") }, + { GRDATAD (TSBA, tsba, DEV_RDX, 22, 0, "bus address register") }, + { GRDATAD (TSDBX, tsdbx, DEV_RDX, 8, 0, "data buffer extension register") }, + { GRDATAD (CHDR, cmdhdr, DEV_RDX, 16, 0, "command packet header") }, + { GRDATAD (CADL, cmdadl, DEV_RDX, 16, 0, "command packet low address or count") }, + { GRDATAD (CADH, cmdadh, DEV_RDX, 16, 0, "command packet high address") }, + { GRDATAD (CLNT, cmdlnt, DEV_RDX, 16, 0, "command packet length") }, + { GRDATAD (MHDR, msghdr, DEV_RDX, 16, 0, "message packet header") }, + { GRDATAD (MRFC, msgrfc, DEV_RDX, 16, 0, "message packet residual frame count") }, + { GRDATAD (MXS0, msgxs0, DEV_RDX, 16, 0, "message packet extended status 0") }, + { GRDATAD (MXS1, msgxs1, DEV_RDX, 16, 0, "message packet extended status 1") }, + { GRDATAD (MXS2, msgxs2, DEV_RDX, 16, 0, "message packet extended status 2") }, + { GRDATAD (MXS3, msgxs3, DEV_RDX, 16, 0, "message packet extended status 3") }, + { GRDATAD (MSX4, msgxs4, DEV_RDX, 16, 0, "message packet extended status 4") }, + { GRDATAD (WADL, wchadl, DEV_RDX, 16, 0, "write char packet low address") }, + { GRDATAD (WADH, wchadh, DEV_RDX, 16, 0, "write char packet high address") }, + { GRDATAD (WLNT, wchlnt, DEV_RDX, 16, 0, "write char packet length") }, + { GRDATAD (WOPT, wchopt, DEV_RDX, 16, 0, "write char packet options") }, + { GRDATAD (WXOPT, wchxopt, DEV_RDX, 16, 0, "write char packet extended options") }, + { FLDATAD (INT, IREQ (TS), INT_V_TS, "interrupt pending") }, + { FLDATAD (ATTN, ts_qatn, 0, "attention message pending") }, + { FLDATAD (BOOT, ts_bcmd, 0, "boot request pending") }, + { FLDATAD (OWNC, ts_ownc, 0, "if set, tape owns command buffer") }, + { FLDATAD (OWNM, ts_ownm, 0, "if set, tape owns message buffer") }, + { DRDATAD (TIME, ts_time, 24, "delay"), PV_LEFT + REG_NZ }, + { DRDATAD (POS, ts_unit.pos, T_ADDR_W, "position"), PV_LEFT + REG_RO }, + { GRDATA (DEVADDR, ts_dib.ba, DEV_RDX, 32, 0), REG_HRO }, + { GRDATA (DEVVEC, ts_dib.vec, DEV_RDX, 16, 0), REG_HRO }, { NULL } }; @@ -369,7 +370,7 @@ DEVICE ts_dev = { NULL, NULL, &ts_reset, &ts_boot, &ts_attach, &ts_detach, &ts_dib, DEV_DISABLE | TS_DIS | DEV_UBUS | DEV_QBUS | DEV_DEBUG | DEV_TAPE, 0, - NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, &ts_help, NULL, NULL, &ts_description }; @@ -1177,6 +1178,27 @@ return SCPE_NOFNC; } #endif +t_stat ts_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, char *cptr) +{ +fprintf (st, "TS11 Magnetic Tape (TS)\n\n"); +fprint_set_help (st, dptr); +fprint_show_help (st, dptr); +fprintf (st, "\nThe type options can be used only when a unit is not attached to a file. The\n"); +fprintf (st, "bad block option can be used only when a unit is attached to a file.\n"); +fprintf (st, "The TS11 does not support the BOOT command.\n"); +#if defined (VM_PDP11) +fprintf (st, "The TS11 device supports the BOOT command.\n"); +#endif +fprint_reg_help (st, dptr); +fprintf (st, "\nError handling is as follows:\n\n"); +fprintf (st, " error processed as\n"); +fprintf (st, " not attached tape not ready\n\n"); +fprintf (st, " end of file bad tape\n"); +fprintf (st, " OS I/O error fatal tape error\n\n"); +sim_tape_attach_help (st, dptr, uptr, flag, cptr); +return SCPE_OK; +} + char *ts_description (DEVICE *dptr) { return (UNIBUS) ? "TS11 magnetic tape controller" : diff --git a/PDP11/pdp11_vh.c b/PDP11/pdp11_vh.c index afd5b22b..cec5045f 100644 --- a/PDP11/pdp11_vh.c +++ b/PDP11/pdp11_vh.c @@ -1586,7 +1586,8 @@ fprintf (st, " sim> SHOW %s CONNECTIONS show current connections\n", dptr->n fprintf (st, " sim> SHOW %s STATISTICS show statistics for active connections\n", dptr->name); fprintf (st, " sim> SET %s DISCONNECT=linenumber disconnects the specified line.\n\n", dptr->name); fprintf (st, "The %s does not support save and restore. All open connections are lost\n", devtype); -fprintf (st, "when the simulator shuts down or the %s is detached.\n", dptr->name); +fprintf (st, "when the simulator shuts down or the %s is detached.\n\n", dptr->name); +vh_help_attach (st, dptr, uptr, flag, cptr); return SCPE_OK; }