[Simh] PDP11 init behavior
Bob Supnik
bob at supnik.org
Sat Oct 19 13:38:42 EDT 2013
Here's a PDP11 SIMH bug as old as the simulator itself: the reset_cpu
routine sets the PS to 340 (interrupts disabled). This causes some
versions of Lunar Lander not to work. In fact, the initial state of the
PS is not architecturally standardized:
04: cleared (from schematics)
05: cleared (from manual)
20: cleared (from schematics)
34: cleared (from schematics), set to 340 on boot?
40: cleared (from schematics)
44: cleared on init, set to 340 on boot (from schematics, manual)
45: cleared (from schematics)
60: cleared (from schematics)
70: cleared (from schematics)
T11: set to 340 (from spec)
LSI11, F11: 4 mode behavior (from memory on power recovery,
cleared on GO, 340 on boot, mode 3 undefined)
J11: 4 mode behavior (from memory on power recovery, cleared on
GO, 340 on boot, 340 on jump to custom PROM)
The story seems to be this. All non-VLSI PDP11s used TTL chips to
implement the PS, either discrete flip-flops, or 4b registers, or both.
Starting with the first system, the 11/20, they were wired clear on the
processor INIT signal (power-up or front panel START switch), so that
all internal state started as 0. This worked fine, because START also
reset the Unibus and cleared all interrupt enables. So even though the
processor was as IPL = 0, no interrupts were possible. Then along came
the LSI11...
The LSI11 implemented a line-time clock with NO INTERRUPT DISABLE. Thus,
if IPL was left at 0 and a bootstrap routine from a slow device was
started (e.g., a floppy drive), the clock would tick, and an interrupt
would occur, before the bootstrap routine finished. Because no vectors
were set up, the processor would crash. So the LSI11 started the
practice, carried over to all later PDP11 VLSI chips, of setting the PS
to 340 before jumping to a boot ROM.
The T11 did this in all modes of startup, because its only startup
behavior was to jump to a "boot" routine. It did not have a console of
any kind.
Accordingly, it appears that the cpu_reset routine needs to set the PS
based on the processor model. Further, all boot routines need to set the
PS to 0 or 340 based on the processor model. (It's probably safe for
boot routines just to set the PS to 340, but it's not technically
accurate.) These are a rather intrusive set of changes, so before I
implement them, I wanted some comments from the community.
/Bob
More information about the Simh
mailing list