From 62879beb7090b7dbdaea50b22a746d602cd0c162 Mon Sep 17 00:00:00 2001 From: Bob Supnik Date: Wed, 15 Mar 2017 10:04:52 -0700 Subject: [PATCH] PDP1, PDP8, PDP18B, PDP11: Fixed dt_seterr to clear successor states For the PDP11, this includes deferring the setting of DONE on an error, allowing RSTS V4 to work correctly. There was a minor (possibly only theoretical) bug in dt_seterr as well. dt_seterr is supposed to stop the drive. If the drive is accelerating, at speed, or stopped, it works fine. But if the drive is decelerating, it did not clear out the "successor" states. In theory, the drive could be in the middle of reversing - that is, there are successor states of accelerating (in reverse) and at speed. So the successor states need to be cleared, or the drive won't actually stop. The fifth DECtape controller (the PDP8's TD8E) is much simpler and doesn't have the problem. --- PDP1/pdp1_dt.c | 2 ++ PDP11/pdp11_tc.c | 8 ++++++-- PDP18B/pdp18b_dt.c | 2 ++ PDP8/pdp8_dt.c | 4 +++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/PDP1/pdp1_dt.c b/PDP1/pdp1_dt.c index e19677da..6c10f030 100644 --- a/PDP1/pdp1_dt.c +++ b/PDP1/pdp1_dt.c @@ -25,6 +25,7 @@ dt Type 550/555 DECtape + 15-Mar-17 RMS Fixed dt_seterr to clear successor states 09-Mar-17 RMS Fixed dt_seterr to handle nx unit select (COVERITY) 28-Mar-15 RMS Revised to use sim_printf 21-Dec-06 RMS Added 16-channel SBS support @@ -868,6 +869,7 @@ if (uptr != NULL) { /* valid unit? */ sim_activate (uptr, dt_dctime); /* sched decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ } + else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */ } DT_UPDINT; return; diff --git a/PDP11/pdp11_tc.c b/PDP11/pdp11_tc.c index ca029d7b..e5782c4d 100644 --- a/PDP11/pdp11_tc.c +++ b/PDP11/pdp11_tc.c @@ -25,6 +25,7 @@ tc TC11/TU56 DECtape + 15-Mar-17 RMS Fixed to defer error interrupts (Paul Koning) 14-Mar-17 RMS Fixed spurious interrupt when setting GO (Paul Koning) 04-Dec-16 RMS Revised to model TCCM correctly (Josh Dersch) 23-Oct-13 RMS Revised for new boot setup routine @@ -1049,7 +1050,9 @@ return SCPE_OK; /* Utility routines */ -/* Set error flag */ +/* Set error flag + Done must be deferred to allow time for interrupt setup (RSTS V4) +*/ void dt_seterr (UNIT *uptr, int32 e) { @@ -1058,7 +1061,7 @@ int32 mot = DTS_GETMOT (uptr->STATE); tcst = tcst | e; /* set error flag */ tccm = tccm | CSR_ERR; if (!(tccm & CSR_DONE)) { /* not done? */ - DT_SETDONE; + sim_activate (&dt_dev.units[DT_TIMER], dt_ctime); /* sched done */ } if (mot >= DTS_ACCF) { /* ~stopped or stopping? */ sim_cancel (uptr); /* cancel activity */ @@ -1067,6 +1070,7 @@ if (mot >= DTS_ACCF) { /* ~stopped or stopping? sim_activate (uptr, dt_dctime); /* sched decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ } +else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */ return; } diff --git a/PDP18B/pdp18b_dt.c b/PDP18B/pdp18b_dt.c index d29f392c..4dabbdd1 100644 --- a/PDP18B/pdp18b_dt.c +++ b/PDP18B/pdp18b_dt.c @@ -27,6 +27,7 @@ (PDP-9) TC02/TU55 DECtape (PDP-15) TC15/TU56 DECtape + 15-Mar-17 RMS Fixed dt_seterr to clear successor states 09-Mar-17 RMS Fixed dt_seterr to handle nx unit select (COVERITY) 10-Mar-16 RMS Added 3-cycle databreak set/show entries 07-Mar-16 RMS Revised for dynamically allocated memory @@ -1283,6 +1284,7 @@ if (uptr != NULL) { /* valid select? */ sim_activate (uptr, dt_dctime); /* sched decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ } + else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */ } DT_UPDINT; return; diff --git a/PDP8/pdp8_dt.c b/PDP8/pdp8_dt.c index 8caf47a7..fb7d7bed 100644 --- a/PDP8/pdp8_dt.c +++ b/PDP8/pdp8_dt.c @@ -1,6 +1,6 @@ /* pdp8_dt.c: PDP-8 DECtape simulator - Copyright (c) 1993-2013, Robert M Supnik + Copyright (c) 1993-2017, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ dt TC08/TU56 DECtape + 15-Mar-17 RMS Fixed dt_seterr to clear successor states 17-Sep-13 RMS Changed to use central set_bootpc routine 23-Jun-06 RMS Fixed switch conflict in ATTACH 07-Jan-06 RMS Fixed unaligned register access bug (Doug Carman) @@ -1073,6 +1074,7 @@ if (mot >= DTS_ACCF) { /* ~stopped or stopping? sim_activate (uptr, dt_dctime); /* sched decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ } +else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */ DT_UPDINT; return; }