From 4ff1e317ac5100eb70380a3a49000747574d4ae6 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 6 Jan 2016 08:09:50 -0800 Subject: [PATCH] PDP11: Fix DLI(DL11) and TDC(TU58) devices to be limited to a total of 16 devices between them --- PDP11/pdp11_dl.c | 27 ++++++++++++++++++++++++--- PDP11/pdp11_td.c | 28 +++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/PDP11/pdp11_dl.c b/PDP11/pdp11_dl.c index 7398d0b0..e65300a9 100644 --- a/PDP11/pdp11_dl.c +++ b/PDP11/pdp11_dl.c @@ -591,6 +591,18 @@ sim_cancel (uptr); /* stop poll */ return r; } +/* Number of DL devices used by TU58 */ + +t_value dlx_tu58_count (void) +{ +DEVICE *td_dptr = find_dev ("TDC"); + +if ((td_dptr == NULL) || + (td_dptr->flags & DEV_DIS)) + return 0; +return (t_value)((DIB *)td_dptr->ctxt)->numc; +} + /* Enable/disable device */ void dlx_enbdis (int32 dis) @@ -600,8 +612,17 @@ if (dis) { dlo_dev.flags = dlo_dev.flags | DEV_DIS; } else { - dli_dev.flags = dli_dev.flags & ~DEV_DIS; - dlo_dev.flags = dlo_dev.flags & ~DEV_DIS; + if (((dli_dev.flags & DEV_DIS) || (dlo_dev.flags & DEV_DIS)) && + (dlx_tu58_count() < 16)) { + if ((dlx_desc.lines + dlx_tu58_count()) > 16) + dlx_desc.lines = 16 - dlx_tu58_count(); + dli_dev.flags = dli_dev.flags & ~DEV_DIS; + dlo_dev.flags = dlo_dev.flags & ~DEV_DIS; + } + else { + dli_dev.flags = dli_dev.flags | DEV_DIS; + dlo_dev.flags = dlo_dev.flags | DEV_DIS; + } } return; } @@ -615,7 +636,7 @@ t_stat r; if (cptr == NULL) return SCPE_ARG; -newln = get_uint (cptr, 10, DLX_LINES, &r); +newln = get_uint (cptr, 10, DLX_LINES - dlx_tu58_count(), &r); if ((r != SCPE_OK) || (newln == dlx_desc.lines)) return r; if (newln == 0) diff --git a/PDP11/pdp11_td.c b/PDP11/pdp11_td.c index bd00bfc5..867750b9 100644 --- a/PDP11/pdp11_td.c +++ b/PDP11/pdp11_td.c @@ -1358,6 +1358,21 @@ static t_stat td_reset (DEVICE *dptr) { CTLR *ctlr; int ctl; +static t_bool td_enabled_reset = FALSE; + +if (dptr->flags & DEV_DIS) + td_enabled_reset = FALSE; +else { + /* When the TDC device is just being enabled, */ + if (!td_enabled_reset) { + char num[16]; + + td_enabled_reset = TRUE; + /* make sure to bound the number of DLI devices */ + sprintf (num, "%d", td_ctrls); + td_set_ctrls (dptr->units, 0, num, NULL); + } + } sim_debug (TDDEB_INT, dptr, "td_reset()\n"); for (ctl=0; ctlflags & DEV_DIS) && + ((((DIB *)dli_dptr->ctxt)->numc + td_ctrls) > 16)) { + dli_dptr->flags |= DEV_DIS; + dli_dptr->reset (dli_dptr); + if (td_ctrls < 16) { + dli_dptr->flags &= ~DEV_DIS; + dli_dptr->reset (dli_dptr); + } + } return td_reset (&tdc_dev); }