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.
This commit is contained in:
Bob Supnik 2017-03-15 10:04:52 -07:00 committed by Mark Pizzolato
parent 1cd11f3464
commit 62879beb70
4 changed files with 13 additions and 3 deletions

View file

@ -25,6 +25,7 @@
dt Type 550/555 DECtape 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) 09-Mar-17 RMS Fixed dt_seterr to handle nx unit select (COVERITY)
28-Mar-15 RMS Revised to use sim_printf 28-Mar-15 RMS Revised to use sim_printf
21-Dec-06 RMS Added 16-channel SBS support 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 */ sim_activate (uptr, dt_dctime); /* sched decel */
DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */
} }
else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */
} }
DT_UPDINT; DT_UPDINT;
return; return;

View file

@ -25,6 +25,7 @@
tc TC11/TU56 DECtape 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) 14-Mar-17 RMS Fixed spurious interrupt when setting GO (Paul Koning)
04-Dec-16 RMS Revised to model TCCM correctly (Josh Dersch) 04-Dec-16 RMS Revised to model TCCM correctly (Josh Dersch)
23-Oct-13 RMS Revised for new boot setup routine 23-Oct-13 RMS Revised for new boot setup routine
@ -1049,7 +1050,9 @@ return SCPE_OK;
/* Utility routines */ /* 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) void dt_seterr (UNIT *uptr, int32 e)
{ {
@ -1058,7 +1061,7 @@ int32 mot = DTS_GETMOT (uptr->STATE);
tcst = tcst | e; /* set error flag */ tcst = tcst | e; /* set error flag */
tccm = tccm | CSR_ERR; tccm = tccm | CSR_ERR;
if (!(tccm & CSR_DONE)) { /* not done? */ 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? */ if (mot >= DTS_ACCF) { /* ~stopped or stopping? */
sim_cancel (uptr); /* cancel activity */ sim_cancel (uptr); /* cancel activity */
@ -1067,6 +1070,7 @@ if (mot >= DTS_ACCF) { /* ~stopped or stopping?
sim_activate (uptr, dt_dctime); /* sched decel */ sim_activate (uptr, dt_dctime); /* sched decel */
DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */
} }
else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */
return; return;
} }

View file

@ -27,6 +27,7 @@
(PDP-9) TC02/TU55 DECtape (PDP-9) TC02/TU55 DECtape
(PDP-15) TC15/TU56 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) 09-Mar-17 RMS Fixed dt_seterr to handle nx unit select (COVERITY)
10-Mar-16 RMS Added 3-cycle databreak set/show entries 10-Mar-16 RMS Added 3-cycle databreak set/show entries
07-Mar-16 RMS Revised for dynamically allocated memory 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 */ sim_activate (uptr, dt_dctime); /* sched decel */
DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */
} }
else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */
} }
DT_UPDINT; DT_UPDINT;
return; return;

View file

@ -1,6 +1,6 @@
/* pdp8_dt.c: PDP-8 DECtape simulator /* 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 Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -25,6 +25,7 @@
dt TC08/TU56 DECtape 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 17-Sep-13 RMS Changed to use central set_bootpc routine
23-Jun-06 RMS Fixed switch conflict in ATTACH 23-Jun-06 RMS Fixed switch conflict in ATTACH
07-Jan-06 RMS Fixed unaligned register access bug (Doug Carman) 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 */ sim_activate (uptr, dt_dctime); /* sched decel */
DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */ DTS_SETSTA (DTS_DECF | (mot & DTS_DIR), 0); /* state = decel */
} }
else DTS_SETSTA (mot, 0); /* clear 2nd, 3rd */
DT_UPDINT; DT_UPDINT;
return; return;
} }