(Click for large version)
The PDP-8/I panel simulation was build in 2016. It's the child of three parents (alien sex!):
- first I programmed the PiDP8 Blinkenlight API server, as a case study.
- after I ported SimH REALCONS from 3.8 to 4.x, it just seemed logical to add a PDP-8 panel simulation to have the PiDP8 under REALCONS control.
- finally while working in my computer club at the PDP-12, the near-by-standing PDP-8/I cried for making pictures.
See here the Java panel on a monitor next to the original:
The PC-monitor is a stylish Acer T232HL 23" touch screen. At 1850 pixel width the panel image has just the original dimensions.
Download and instructions are here at GitHub. The startup script is "pdp8i_os8advent" .
Operating the Java panel
As usual the panel simulation is a platform-independent Java application.
All switches are operated by clicking with the mouse onto them. You can switch several keys at once by holding the mouse button down and dragging over them.
All switches perform a function, including PANEL LOCK and POWER. The only exception is the "Sing Step" switch: SimH does not emulate the PDP-8 on cycle level, so cycle stepping cannot be performed. Likewise, the "Major State Indicators" "Fetch, Execute, Defer ... Break" are not quite accurate.
The lamp indicators also work as expected. A software low pass make them "lazy", and dim lamps are painted in a browner color. For the red shift of dim lamps a real PDP-10 panel was driven with different voltages and photos of the color shifts were analyzed.
Luckily I resisted to let some lamps "burn out" ... with the option to fix by clicking 10x onto them.
SimH 4.x module "pd8_cpu.c" has been heavily edited to add as much functionality as possible. No running PDP8I was there as reference, so it's all based on paper-work. Real PDP8I's will behave slightly different.
On the first look the panel is quite puzzeling ... they all are. But the basic operation with "Load Add", "Dep", "Exam", "Cont", "Stop" and "Sing Inst" is as expected, see the PDP-11/40 for detail. As usual, the "Dep" switch is inverted to prohibit accidently memory overwrite.
DEC document "Maintenance Manual PDP-8I Volume I" (Jul 1969, DEC-8I-HR1A-D), Chapter 3 is quite clear, but sometimes a bit half-hearted. I just cite it here:
Although not marked on the front panel, register bits are numbered from left to right starting with zero. Therefore the most significant (leftmost) bit in the program counter (PC) is identified as PC00, and the least (rightmost) significant bit is identified as PC11. Table 3-1 contains a listing of the PDP-8/I controls and indicators within their functions. The PDP-8/I controls (except the power and panel lock switches) are of two types: butterfly switches, and momentary-contact switches. The butterfly switches are considered to be in their zero or off-state when the top half of the butterfly is fully depressed, and are considered to be in their one or on state when the bottom half of the butterfly is depressed. The momentary-contact switches include the Start, Exam, Load Add, Cont, Dep and Stop switches. These switches (except Dep) are actuated when the bottom half is fully depressed. The Dep switch is the reverse of the above. Indicators are considered to be in their on or one state when they are lit, and in their off or zero state when not lit.
Panel Lock key switch: When turned clockwise, this key-operated switch disables all controls except the Switch Register switches on the operator console. In this condition, inadvertent key operation cannot disturb the program. The program can, however, monitor the content of SR by execution of the OSR instruction.
Power key switch: This key-operated switch controls application of primary power to the computer. When this switch is turned clockwise, primary power is applied.
Start key: Starts the program by turning off the program interrupt circuits clearing the AC and L, setting the Fetch state, and starts the central processor.
Load Add key: This key transfers the content of SR into PC, the content of INST FIELD switches into IF, the content of the DATA FIELD switches into DF, and clears the major state flip-flops.
Dep key: This key transfers the content of SR into MB and core memory at the address specified by the current content of PC. The major state flip-flops are cleared. The contents of PC is then incremented by one to allow storing of information in sequential core memory addresses by repeated operation of the Dep key.
Exam key: This key transfers the content of core memory at the address specified by the content of PC, into the MB. The content of the PC is then incremented by one to allow examination of the contents of sequential core memory addresses by repeated operation of the Exam key. The major state flip-flop register cleared. The MA indicates the address of the data in the MB.
Cont key: This key sets the RUN flip-flop to continue the program in the state and instruction designated by the lighted console indicators, at the address currently specified by the PC if key SS is not on.
Stop key: Causes the RUN flip-flop to be cleared at the end of the instruction in progress at the time the key is pressed.
Sing Step key: This key causes the RUN flip-flop to be cleared to disable the timing circuits at the end of one cycle of operation. Thereafter, repeated operation of the Cont key steps the program one cycle at a time so that the operator can observe the contents of registers in each major state.
Sing Inst key: This key allows execution of one instruction. When the computer is started by pressing the Start or Cont key, the Sing Inst key causes the RUN flip-flop to be cleared at the end of the last cycle of the current instruction. Thereafter, repeated operation of the Cont key steps the program one instruction at a time.
Switch Register: Provide a means of manually setting a 12-bit word into switches the machine. Load the content of this register into PC by pressing the Load Add key or load the content into the MB and core memory by the Dep key. Under program control, the OSR and LAS instructions can set the content of SR into AC.
Data Field indicators: The indicators denote the content of the data field and switches register (DF), and the switches serve as an extension of SR to load DF by means of the Load Add key. DF determines the core memory field of data storage and retrieval.
Inst Field indicators: The indicators denote the content of the instruction and switches field register (IF), and the switches serve as an extension of SR to load the IF by means of the Load Add key. IF determines the core memory field from which instructions are to be taken.
Program Counter: The PC contains the location of the next instruction to indicators be performed.
Memory Address: Indicate the content of MA. Usually, the contents of MA indicators denote the core memory address of the word currently or previously read or written. After operation either the Dep or Exam key, the contents of MA indicate the core memory address just examined or deposited into.
Memory Buffer. Indicates the content of MB. Usually, the contents of MB indicators designate the word just written at the core memory address in MA.
Accumulator: Indicates the content of AC.
Link: Indicates the content of L.
Multiplier Quotient: Indicates the content of the multiplier quotient (MQ). MQ holds the multiplier at the beginning of a
multiplication and holds the least-significant half of the product at the conclusion. It holds the least-significant half of the dividend at the start of
division and holds the quotient at the conclusion.
Major state indicators:
Fetch: Indicates that the processor is currently performing or has performed a Fetch cycle.
Execute: Indicates that the processor is currently performing or has performed an Execute cycle.
Defer: Indicates that the processor is currently performing or has performed a Defer cycle.
Word Count: Indicates that the processor is currently performing or has performed a Word Count cycle.
Current Address: Indicates that the processor is currently performing or has performed a Current Address cycle.
Break: Indicates that the processor is currently performing or has performed a Break cycle.
Ion: Indicates the 1 status of the INT.ENABLE flip-flop. When lit, the interrupt control is enabled for
information exchange with an I/O device.
Pause: Indicates the 1 status of the PAUSE flip-flop when lit. The PAUSE flip-flop is set for 2.75 µs by any IOT
instruction that requires generation of IOP pulses or by any EAE instruction that require shifting of
Run: Indicates the 1 status of the RUN flip-flop. When lit, the internal timing circuits are enabled and the machine
And: Indicates that the processor is currently performing or has performed an And instruction.
Tad: Indicates that the processor is currently performing or has performed a Tad instruction.
Isz: Indicates that the processor is currently performing or has performed an Isz Instruction.
Dca: Indicates that the processor is currently performing or has performed a Dca Instruction.
Jms: Indicates that the processor is currently performing or has performed a Jms instruction.
Jmp: Indicates that the processor is currently performing or has performed a Jmp instruction.
Iot: Indicates that the processor is currently performing or has performed an Iot instruction.
Opr: Indicates that the processor is currently performing or has performed an Opr instruction.
A big problem was the condition of our PDP-8/I: it was incomplete, cabling and power supplies missing. I had to made special flip-chip adapters just to feed power into the frontpanel light bulbs. First I tried to "cheat" and take the lamp images from a near-by running PDP-8/E, but this was impossible: the 8/I has square lamps, the 8/E round ones.
Everything outside the optical axis is messed up ...
I took the images with a 20 MPixel Canon DSLR and the 100/2.8 non-zoom EF-MACRO lens. Light direction was adjusted for the butterfly-switches, they should appear with best 3D effect. The challenge was to keep the glowing lamps and the black panel background equally structured (no totally white or totally black areas). Solution was a long exposure time for the lamps, then an additional reduced flash to highlight the black panel acryl. DSLR and flash were operated in "manual" mode (even no autofocus!), to guarantee all pictures were shot under exact the same conditions.
The images were then enhanced in Photoshop. A very important decision was: how much optical defects should be removed? The panel should look "nice", but also "realistic". I finally removed almost all defects on the panel itself (cratches, label traces, paint damages), but let the gray rack side walls in their orignal rusty state.
* * *
Display of the lightbulbs was major research. The bulbs can be only "On" or "Off", but if switched fast, they have to appear dimmed. Producing the "dimming" effect with a very high picture update rate is impractical:
- CPU load on weak platforms (Raspberry) and high image resolutions is unbearable.
- Since running programs on SimH consist of many nested loops, the panel lights are driven with a wide spectrum of semi-constant flicker frequencies. Way too often these mix with the image update frequency and produce stroboscopic artifacts, even at high upate rates.
- A "dimmed" light bulb isn't just "darker", it also gets a red shift. The effect is best described as "brown-out".
The Java implemention displays the light bulbs now in a three stage pipeline:
- Lightbulb states coming from SimH over network are saved in a ringbuffer with timestamps.
- Lightbulb images are updated by an independent thread in regular intervals (25 per second). If time has come to display the bulb, an averaging logic calculates the mean energy level for the last display interval. This is in fact a low-pass with a cut-off frequency of about 5 Hz.
- from energy level the brightness and brown-shift is calculated over a look-up table. That table was produced by driving the bulb of a PDP-10 header panel (same type and age as the 8/I) with 16 different watt levels and taking pictures. Then the RGB values of those image were extracted and used to modify the colors of the PDP-8 bulbs.
http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code was used to cross-check.
But that's still not the whole story: Brightness can not be made by just painting a birghter or darker bulb image. A bulb in the "Off" state must not be painted as black circle, but has in fact to be 100% transparent, so the gray window on the acryl glass gets visible.
Bottom line: Dimmed light bulbs are displayed with a mix of color change, alpha transparency and brightness-level.
DEC panel light bulbs at different power levels.