[Simh] Configuring DMC11 Devices
Paul Koning
paulkoning at comcast.net
Mon Jan 4 14:38:28 EST 2016
It looks like the problems RSTS is having with DMC/DMR is due to unexpected behavior of the master clear bit. It's documented as self-clearing, so the driver sets it and then subsequently assumes it will read as cleared. That isn't actually happening correctly, at least not if two accesses are close together:
DBG(4466384761)> DMC REG: dmc_wr(DMC0), addr=0x003fe038, SEL0, newdata=0x4000, olddata=0x8200
DBG(4466384761)> DMC REG: DMC0: Setting SEL0 (0x4000) MCLR
DBG(4466384764)> DMC REG: dmc_wr(DMC0), addr=0x003fe038, BSEL0, newdata=23, olddata=0x00
DBG(4466384764)> DMC REG: DMC0: Setting SEL0 (0x4023) MCLR RQI
This is the driver doing a master clear, quickly followed by a Request In asking to set the Base address. That second operation is a byte write to BSEL0, and it relies on MCLR being either write-only, or at least self-clearing fast enough. In this case, clearly that is not working; MCLR is still set so the byte write sets not just RQI and BASEI, but also MCLR -- so RDYI is never set, the driver times out, and the cycle repeats.
This patch (hack?) fixes the issue, and now my two cross-connected DMCs successfully start:
diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c
index e0e0111..6034683 100644
--- a/PDP11/pdp11_dmc.c
+++ b/PDP11/pdp11_dmc.c
@@ -3592,7 +3592,7 @@ else {
if ((dmc_getsel(reg) == 0) || (dmc_getsel(reg) == 1)) {/* writes to SEL0 and SEL2 are actionable */
if (0 == controller->dmc_wr_delay) { /* Not waiting? */
- controller->dmc_wr_delay = 10; /* Wait a bit before acting on the changed register */
+ controller->dmc_wr_delay = 1; /* Wait a bit before acting on the changed register */
sim_activate_abs (controller->unit, controller->dmc_wr_delay);
}
}
By the way, if I connect a DMC to a DMR, it doesn't come up. Is that expected? I thought DMC and DMR were sufficiently compatible that it would work...
paul
More information about the Simh
mailing list