BlinkenBone panel simulations
Several photorealistic "blinkenlight panels" are delivered with BlinkenBone.
They are implement as platform-independen Java programs, which are controlled by SimH with REALCONS extension.

Working with the panels is fun, but you must know what lamps and switches are for, and how to operate those ancient operation systems.
See here docs about each implemented panel and the ready-to-run setup in the distribution:
Programming the PDP-15
- Details
- Written by: Administrator
- Parent Category: Projects
- Category: BlinkenBone panel simulations
The PDP-15 distributions at GitHub comes with two software packages:
- A very simple application is "Paper Tape FOCAL",
- the other contains a disk-based operation system "XVM/DOS" and the multi-user capable "XVM/RSX" .
If you want to write own programs, you need a MACRO-15 assembler or a PDP-15 FORTRAN. There are no cross-assemblers running on modern hardware, so XVM/DOS is used to development a small assembler program.
Paper tape FOCAL
FOCAL is a BASIC-like interpretative arithmetic language. It can be run from a paper tape strip without need for any additional software. In this it resembles the BASIC ROM interpreters of early micro computers (PET, Apple II): here the ROM is made from paper holes instead of transistor cells.
To boot the PDP-15 from papertape just execute the "pdp15_focal" batch file. Normally pressing the READ IN key is necessary, but we're cheating here, for your convenience.
The manual is "Focal Programming Manual PDP-15 Systems (Oct 1970, DEC-15-KJZB-D).pdf".
http://www.ibm.com/developerworks/library/os-emulatehistory/ has a simple demo. They enter and run this program:
*01.10 ASK "WHAT YEAR WERE YOU BORN?", BORN
*01.20 ASK "WHAT YEAR IS IT?", YEAR
*01.30 SET AGE=YEAR-BORN
*01.40 TYPE "YOU ARE ", AGE-1, " OR ", AGE, " YEARS OLD.", !
*GO
WHAT YEAR WERE YOU BORN?:1964
WHAT YEAR IS IT?:2010
YOU ARE 45.0000 OR 46.0000 YEARS OLD.
*
Not too impressive, but at least the math is correct. See here a walk-through:

XVM/DOS - editing and assembling
This software package is the one distributed with SimH itself. Primary focus for them is booting XVM/RSX, with RSX/DOS only acting as boot step. But since I still panic when I see the "MCR>" prompt, I choose XVM/DOS as development environment.
The XVM/DOS is quite mystic too, but not too complex. Docs are all at bitsavers. Here we need:
- XVM-DOS USERS MANUAL (Jan 1976, DEC-XV-ODMAA-A-D).pdf
- Programmer's Reference Manual PDP-15 Utility Programs (Oct 1969, DEC-15-YWZA-D).pdf
- PDP-15 MACRO-15 ASSEMBLER PROGRAMMER'S REFERENCE MANUAL (Oct 1969, DEC-15-AMZA-D).pdf
So now follow me stumbling through the pits of a completly unkown user shell (PDP-15 old-timers, please don't laugh!)
A login is possible, but not necessary.
File handling: DIR, DELETE, RENAME
There's no "DIR" command. To list files, PIP must be used:
$PIP
PIP XVM V1A000
>L TT_SY
01-JAN-79
DIRECTORY LISTING (SCR)
110710 FREE BLKS
10 USER FILES
320 USER BLKS
BUILD XCT 1 13-JAN-99
BUILD XCU 33 13-JAN-99
CODE SRC 105 13-JAN-99
RSXPAT XCT 1 13-JAN-99
RSXPAT XCU 1 13-JAN-99
RSX BAT 153 13-JAN-99
HALT SRC 1 01-JAN-88
CLOSE HAL 1 01-JAN-88
>^C
XVM/DOS V1A000
$
There is also no RENAME nor a DELETE under XVM/DOS. These can be called from within the editor!
Editing texts
The text editor is line oriented, of course. There is an EDIT mode to issue commands, and an INSERT mode to write text. Features like BLOCK mode, INPUT file and OUTPUT file are there to deal with devices like tape, and with limited memory usage.
Call:
$EDIT
EDITOR XVM V1A000
>
Most commands in EDIT mode have a single-letter form:
| Command |
Short |
Description |
| DELETE | CALL DELETE INPUT <filename> <ext> Note the space between <filename> and <ext>A file is deleted from disk. Works only before any editing command! |
|
| RENAME |
CALL RENAME INPUT <filename1> <ext1> <filename2> <ext2> |
|
| OPEN |
OPEN <filename> <ext> |
|
| CLOSE | CLOSE [<filename> <ext>] Saves a file to disk. The name can be changed. |
|
| QUIT | ^C | Exit editor. |
| INSERT | <CR> | In EDIT mode, the ENTER key switches to INSERT mode. Then text can be typed |
| EDIT | <CR> ^P |
Ctrl-P leaves the INSERT mode, back to EDIT mode. Also does a single <CR>: you can not simply enter empty lines. |
| TOP | T | Make the top most line current (goto the virtual line before the first one) |
| NEXT <n> | N <n> | Go down n lines. To goto an absolute line number, use T N <line#> |
| PPRINT | P | Display current line |
| PRINT <n> | P <n> | List (print) the <n> next lines, new current lin is last printed. |
| INSERT | I <text> | Insert a new line <text> after the current line. Notice the <space> after "I". |
| REPLACE | R <text> | Replace the current line with <text>. Notice the <space> after "R". |
| DELETE | D | Delete the current line |
Running the MACRO-15 assembler
Call:
$MACRO
MACRO XVM V1A000
>
After the ">" prompt, a "command string" must be entered. It is of the form
<OPTION> <OPTION>←<filename>
Options are single letters separated by spaces. Interesting ones:
L create listing
N number lines decimal
A print symbols
And yes, the ASR-33 teletype had an "←" symbol on its keyboard, don't you have one?
No problem: the "←" is today displayed as the underline "_".
So an assembler call may look like this (the program "HALT SRC" contains only a single HALT opcode):
$MACRO
MACRO XVM V1A000 >A L N_HALT END OF PASS 1
PAGE 1 HALT SRC
1 / DEMO PROGRAM: JUST A HALT
2 00100 A .LOC 100
3 00100 A 740040 A HLT
4 000000 A .END
SIZE=00101 NO ERROR LINES
PAGE 2 HALT SRC
.CLEAR MACRO .CLOSE MACRO .DLETE MACRO .ENTER MACRO
.EXIT MACRO .FSTAT MACRO .GET MACRO .GTBUF MACRO
.GVBUF MACRO .INIT MACRO .MTAPE MACRO .MTRAN MACRO
.OVRLA MACRO .PUT MACRO .RAND MACRO .READ MACRO
.RENAM MACRO .RTRAN MACRO .SEEK MACRO .SETUP MACRO
.SYSID MACRO .TIMER MACRO .TRAN MACRO .USER MACRO
.WAIT MACRO .WAITR MACRO .WRITE MACRO .XVMOF MACRO
.XVMON MACRO
MACRO XVM V1A000
>
The "running light program"
Now that we can assemble, the "Hello world" of BlinkenLight panels is next. It loads the pattern of the DATA switches into the accumulator AC, then shifts it right and HALTS. On CONT another shift is done, and so on.
/ "RUNNING LIGHT" PROGRAM
/ ROTATES THE PATTERN OF THE DATA SWITCHES RIGHT ON EACH CONT
/ SET REGISTER SELECT TO "AC" TO SEE PATTERN.
/ TRY "CONT" WITH AUTO REPEAT!
.LOC 100 / SET POSITION IN MEMORY
START LAS / LOAD DATA SWITCHES INTO AC
LOOP RAR / ROTATE AC AND LINK RIGHT
HLT / WAIT FOR CONT
JMP LOOP / AGAIN
.END
Assembling - a complete walk-through
1. Boot
PDP-15 simulator V4.0-0 Beta REALCONS git commit id: $Format:
Listening on port 2311
Searching realcons controller "PDP15" ...
Connecting to host localhost ...
REALCONS PDP15, host="localhost", host panel="PDP15", interval = 1 msec, connected, boot image filename not set, nodebug,
panel BlinkenBoards driver hardware state = ACTIVE,
server info=
Server info................: PanelsimPDP15_app v1.00
Server program name........: blinkenbone.panelsim.panelsimPDP15.PanelsimPDP15_app
Server command line options: --width 1000 --repeat_rate 8 --register_select 10
To boot XVM/RSX, type "RSX" and press enter at the XVM/DOS "$" prompt.
To return to XVM/DOS, type "DOS" and press enter at the RSX MCR prompt.
To access the extra terminals, telnet to 127.0.0.1 on port 2311 and press Ctrl-T
to bring up the login prompt.
To log off MULTIACCESS, use the TDV command "OFF".
XVM/DOS V1A000
ENTER DATE (MM/DD/YY) - 01/01/79
PAGE MODE 128K API ON XVM ON SCR
$
2. Edit
$EDIT
EDITOR XVM V1A000
>CALL DELETE INPUT LIGHT SRC
>
INPUT
/ "RUNNING" LIGHT PROGRAM
/ ROTATES THE PATTERN OF THE DATA SWITCHES RIGHT ON EACH CONT
.LOC 100
LAS / LOAD DATA SWITCHES INTO ACCUMULATOR AC
LOOP RAR / ROTATE AC AND LINK RIGHT
HLT / WAIT FOR CONT
JMP LOOP / AGAIN
.END
EDIT
>CLOSE LIGHT
EDITOR XVM V1A000
>EXIT
XVM/DOS V1A000
$
We saved the new file as "LIGHT SRC".
3. Is the new source file there?
$PIP
PIP XVM V1A000
>L TT_SY
01-JAN-79
DIRECTORY LISTING (SCR)
110707 FREE BLKS
11 USER FILES
321 USER BLKS
BUILD XCT 1 13-JAN-99
BUILD XCU 33 13-JAN-99
CODE SRC 105 13-JAN-99
RSXPAT XCT 1 13-JAN-99
RSXPAT XCU 1 13-JAN-99
RSX BAT 153 13-JAN-99
HALT SRC 1 01-JAN-88
LIGHT SRC 1 01-JAN-79
CLOSE HAL 1 01-JAN-88
>^C
XVM/DOS V1A000
$
Yes, LIGHT SRC is there!
4. Assemble
$MACRO
MACRO XVM V1A000
>L_LIGHT
END OF PASS 1
PAGE 1 LIGHT SRC
/ "RUNNING" LIGHT PROGRAM
/ ROTATES THE PATTERN OF THE DATA SWITCHES RIGHT ON EACH CONT
/ SET REGISTER SELECT TO "AC" TO SEE PATTERN.
/ TRY "CONT" WITH AUTO REPEAT!
00100 A .LOC 100
00100 A 750004 A LAS / LOAD DATA SWITCHES INTO ACCUMULATOR AC
00101 A 740020 A LOOP RAR / ROTATE AC AND LINK RIGHT
00102 A 740040 A HLT / WAIT FOR CONT
00103 A 600101 A JMP LOOP / AGAIN
000000 A .END
SIZE=00104 NO ERROR LINES
MACRO XVM V1A000
>^C
XVM/DOS V1A000 $
Entering and starting the LIGHT program
Now that we have the binary code of LIGHT, we must enter it into memory. This will destroy the XVM/DOS memory image, but never mind.
From the listing we can see that the SimH commands would be:
sim> deposit 100 750004
sim> deposit 101 740020
sim> deposit 102 740040
sim> deposit 103 600101
But we use the panel now!
| Step | Switches | Cmd switch | Description |
| 1. | Preparation | ||
| 1.1. | STOP | Stop program execution, if running | |
| 1.2. | REG GROUP inactive REGISTER SELECT = "OA" |
Display memory address ("operand address") on REGISTER lamps | |
| 2. | Enter data into memory | ||
| 2.1. | ADDRESS = 000100 DATA = 750004 |
DEPOSIT THIS | Set memory word at 100 to 750004 See image below |
| 2.2. | DATA = 740020 | DEPOSIT NEXT | Set memory word at 101 to 740020 |
| 2.3. | DATA = 740040 | DEPOSIT NEXT | Set memory word at 102 to 740040 |
| 2.4. | DATA = 600101 | DEPOSIT NEXT | Set memory word at 103 to 600101 |
| 3. | Verify data in memory | ||
| 3.1. | ADDRESS = 000100 | EXAMINE THIS | Verify word at 100 on MEMORY BUFFER lamps: 750004 |
| 3.2. | EXAMINE NEXT | Verify word at 101 | |
| 3.3. | EXAMINE NEXT | Verify word at 102 | |
| 3.4. | EXAMINE NEXT | Verify word at 103 | |
| 4. | Run | ||
| 4.1. | REG GROUP inactive REGISTER SELECT="AC" |
Display accumulator "AC" on LINK and REGISTER lamps | |
| 4.2. | DATA = pattern | Select a data pattern to shift | |
| 4.3. | ADDRESS = 000100 | START | Start program at address 100. It HALTs at PC=103 and shows the shifted pattern. (Set REGISTER SELECT = "PC" to verifyOA |
| 4.4. | CONT | Next shift, and HALT again, and so on. | |

Deposit 750004 into address 100
Debugging with Single Step
You can set SING INST and single step through the program with CONT. You have to set the REGISTER SELECT knob to "PC" to see the program counter changing. It should go 101, 102, 103, 101, 102, 103, .... on each CONT.
More fun: REPEAT
You can use the REPEAT feature to automatically fireing CONT events with varying frequency. This works in normal mode and with SING INST!
Just set REPT active and keep CONT pressed !
Excercises to the reader
- Change the "LIGHT" program from a running dot into a binary counter.
- Enter and run the "Hello World" program in the attachement.
pdp15_hello.lst -- PDP-15 assembler listing for a \"Hello World\" program.
Simulated PDP-15 panel
- Details
- Written by: Administrator
- Parent Category: Projects
- Category: BlinkenBone panel simulations
(Click to enlarge)
The PDP-15 is the last of DEC's 18-bit architectures, which began with the PDP-1.
See here the installation of the Institute for Numerical Mathematics in Goettingen, 1972 :

Lately I was donated a physical PDP-15 panel, formely used in the "DFVLR" Göttingen, now DLR. (Finally all this "BlinkenStuff" pays off!) And after making another physical BlinkenBone box out of it (yawn!), also the Java simulation was a must-have (pain!).

One for you, one for me!
Download and run
You can download a distribution with Java panel, SimH, a demo application and instructions here at GitHub. One startup script is "pdp15_focal", a more compelx installation is "pdp15_xvmdosrsx".
Operating the Java panel
As usual the panel simulation is a platform-independent Java application.
If you never worked with DEC console panels before, check out the tutorial for the PDP-11/40 first.
The PDP-15 is a bit easier to operate, since it has separate ADDRESS and DATA switches, so you do not need to save an address with LOAD ADR. And for EXAM and DEPOSIT there are separate THIS and NEXT switches for optional address autoincrement.
All switches are operated by clicking with the mouse onto them. More fun is finger-tapping on a large touch screen monitor. You can switch several keys at once by holding the mouse button down and dragging over them.
The two rotary knobs to the right are special:
- on first click they change from normal "side view" to "top view", so you can see better the printed marks.
- in "top view" a click to the left half of a knob rotates it counter-clock wise, a click in the right half rotates clock-wise.
- After a few seconds idle time the display changes back to "normal".
![]() |
|
Differences to the real thing
Due to limitation of SimH (and due to my own ones!) there are some differences to a real PDP-15.
- SimH does emulate on architecture level, but does not reproduce the actual electronics. So some hardware related functions are not available.
- And I've never see a running PDP-15 (are there any?), so all functions are concluded from paper documentation.
Most switches perform a function (or will in the future ...)
- EXEC does nothing. It should execute the opcode set by the DATA switches.
- CLOCK and BANK MODE simply turn on the corresponding lamps.
- PROT is not yet implemented.
- The single step switches SING TIME and SING STEP perform like SING INST.
The PDP-15 executes an instruction in several MAJOR STATE phases, each divided in TIME cycles. SimH does emulate the PDP-15 on register level, so "CYCLE" and "TIME" stepping cannot be performed. Likewise, the "MAJOR STATES" and "TIME STATES" indicators are just a fake.
Most lamp indicators also work as expected. A software low pass make them "lazy", and dim lamps are painted in a browner color.
You find more about the lamps at bottom of the PDP-8/I page.
Bit numbering
Every number in the PDP-15 world is written octal. There are 18 data bits and 15 address bits.
As usual on earlier DEC machines, bit strings are written with the high-most bit to the left ... as today.
But the bit numbers are reversed: The most significant bit MSB (which has the highest value in integer representations) has number "0",
then bit numbers increase from left to right.

Bit numbers are reversed
First let's look onto 18 bit DATA.
Modern bit numbers are: 17, 16, 15, ... 0.
This appears on the PDP-15 panel as: 0, 1, 2, ... 17.
Got it? Then lets make things more complicated.
15-bit ADDRESSes are shorter than 18-bit DATA words, and the least significant bit (DEC bit number #17) of addresses and data must kept aligned.
Only solution is: number the address bits from 3 upto 17.
Modern address bit numbers are: 15, 14, 13, ... 0.
PDP-15 address bit numbers: 3, 4 ,5 ... 17 !
No wonder this notation didn't survive.
DEC's panel reference
Here comes the DEC documentation for the switches. The documents are "PDP-15 Systems Reference Manual" (Aug 1969, DEC-15-BRZA-D), Chapter 10 "Console", and "XVM system reference manual (Jun 1976, EK-15XVM-OP-001).pdf", chapter 4.
"The PDP-15 console (see Figure 10-1) provides access to, or control over, virtually every portion of the PDP-15. All registers, buses, and controls are multiplexed down a single console cable to display the equivalence of 24 registers and 34 control functions. The console provides extensive control for real-time debugging and comprehensive man-machine interaction during checkout.
The following momentary contact switches are on the console panel: Start, Execute, Continue, Stop, Reset, Read In, Deposit This, Deposit Next, Examine This, Examine Next.
| Switch | Function |
| DATA | These 18 switches may be read indirectly into the accumulator by the execution of a OAS (OR accumulator content with switches content) instruction in an operating program. Data may be inserted manually into the machine with these switches by means of the DEPOSIT and DEPOSIT NEXT keys. |
| ADDRESS | The memory address required by the START, READ IN, EXAMINE, and DEPOSIT keys is supplied by these switches. When one of these keys is depressed, the address given by the address switches is loaded into the MA (memory address) register and the key instruction is executed. |
| REG GROUP | Selects which of two groups of 12 registers to be selected by the register select switch. In the OFF position the normal registers may be viewed while the ON position allows viewing of the maintenance registers. (See Register Select Switch). |
| CLOCK | The ON position disables the real-time clock from issuing program interupt (PI) requests. |
| REPT |
With this switch in the ON position, the processor will repeat the key function depressed by the operator at the rate specified by the repeat clock. Start - program execution will restart at the repeat speed after the machine halts. Execute - the instruction in the data switches will be executed at the repeat Continue - program execution will continue at the repeat speed after halting. Deposit: This, Next. Examine: This, Next - the Deposit, Deposit Next or Examine Depressing STOP or turning off the repeat switch will halt the repeat action. |
| BANK MODE | When set (back half of switch pressed), pressing START causes the system to start in Bank mode permitting direct addressing of 8,192 (17777o) word of core memory. When switch is not set (front half pressed), pressing START causes the system to start in Page mode permitting direct addressing of 4,096 (7777o) words of core memory. |
| SING TIME | Halts execution of the program after each time state has been completed. |
| SING STEP | Halts execution of the program after each major state has been completed. |
| SING INST | Halts program execution after each instruction has been completed. |
| START | Initiates program execution at the location specified by the address switches. |
| EXEC | Executes the instruction in the data switches and halts after execution. |
| CONT | Resumes program execution from the location specified by the program counter (PC). Also used to advance machine while in single time, step or instruction. |
| STOP |
Halts the processor after the completion of the present instruction. STOP is the only switch active while the machine is running. If, at any time, the machine must be reset while the RUN light is on, the RESET and STOP switches should be pressed simultaneously. This is an unconditional reset procedure that should be used with caution, beacuse data can be lost. |
| RESET | Generates a power clear signal which clears all active registers and all control flip-flops except the program counter (PC). |
| READ IN | Initiates the read-in of paper tape punched in binary code (each set of three 6-bit lines read from tape forms one 18-bit computer word). Storage of words read-in begins at the memory location specified by the ADDRESS switches. At the completion of tape read-in, the processor reads the last word entered and executes it. |
| DEPOSIT THIS | Deposits the contents of the data switches into the memory location specified by the address switches. After the transfer, the memory locations address is in the OA (operand address) register and the contents of the accumulator switches are in the MO (memory out) register. |
| DEPOSIT NEXT | Deposits the contents of the data switches into the location given by OA ±1. This permits the loading of sequential memory locations without the need of loading the address each time. |
| EXAMINE THIS | Places the contents of the memory location specified by the address switches into the memory buffer register. The address is loaded into the OA (operand address) register. |
| EXAMINE NEXT | Places the contents of the memory location specified by the OA + 1 (operand address plus 1) into the memory buffer register. Sequential memory locations may be examined using the Examine-Next switch. |
| PROT | Initiates the memory protect feature. When utilized, the protect feature prevents the read-in of data into the specified "protected" memory locations. |
| Register Select | The 12 position Register Select rotary switch can select the following registers for viewing in the REGISTER indicators (under control of the Register Group switch). Register Group Switch OFF: AC Accumulator Register Group Switch ON: A BU A Bus |
| Power/Repeat Switch | A variable-pot/switch provides the POWER ON/ OFF control at one end of its rotation and variable repeat speed (approximately 1 Hz to 10 kHz) over the remainder of its rotation. |
| Indicator | Function |
| POWER | Indicates that the power supply voltages are at operating levels. |
| RUN | Indicates that program execution is in progress. |
| CLOCK | Indicates that the real-time clock facility is enabled. |
| DCH ACTIVE | Lights when the data channel is beeing serviced, i.e., data is being transferred between core memory and a device via the I/O bus. |
| API ENABLE | Lights when the automatic priority interrupt system is activated. |
| API STATES ACTIVE | Indicates API level(s) active. 0-3: Hardware levels. 4-7: Software levels. |
| MAJOR STATES | FETCH: Indicates that the processor is in the Fetch state. INC: Indicates that the processor is in the Increment state. DEFER: Indicates that the processor is in the Defer state. EAE: Indicates that the processor is in the EAE (extended arithmetic element) instruction state. EXEC: Indicates that the processor is in the Execute state. |
| TIME STATES 1,2,3 | Indicates the processor time states. When all time states are off, machine is in time state 2A of the Add instruction. |
| PI ACTIVE | Indicates that a program interrupt is pending service. |
| PI ENABLE | Indicates that the program interrupt system is enabled (under program control). |
| MODE INDEX | Indicates that the processor is operating in Page mode and therefore indexing can be accomplished. |
| LINK | Display state of Link bit. |
| INSTRUCTION | Displays contents of 6-bit program word instruction field. 0-3: Displays the instruction operation code. DEFER: Indicates that the operand is indirectly addressed. INDEX: Indicates that the operand address is indexed when in Page mode or that the upper 4K (of an 8K bank) is addressed when in Bank mode. |
| MEMORY BUFFER 00-17 | Displays the content of the currently addressed memory address. |
| REGISTER 00-17 | Used with the setting of the REG GROUP and Register Select switches to display: a. Data in a register b. Data on a bus c. Coontrol signal levels |
Some additional notes
Switch orientation: The switches are "butterfly" switches, which can be pressed down facing to you or facing to the panel.
If a switch faces the panel a white "I" is visible, indicating the switch is in the "active" state (on ADDRESS and DATA interpreted a "1" bit value).
POWER: the PDP-15 is powered by rotating the upper knob "REPEAT RATE" (labeled "FAST").
The logic is like an old radio volume control.
So when modifying the repeat rate, be sure not to switch the machine of by accident!
Booting from paper tape: READ IN reads a paper tape strip and starts execution.
Under SimH the file with the paper tape image is specified like
sim> set realcons bootimage=focal15.bin
REPEAT logic: This is something very cool! Several "momentary action" switches can be fired automatically with varying frequency, if you keep them pressed down.

Stuff related to the "REPEAT" feature
The REPEAT feature is enabled with the "REPT" switch.
The frequency is set with the upper knob. Originally you could select up to 10 kHz, but the simulations limits this to 100 Hz. ('cause every command is echoed on SimH's console).
These buttons have auto repeat: START, EXEC, CONT, EXAM THIS/NEXT, DEPOSIT THIS/NEXT
So you can single step in high speed by setting REPT and SING INST, then hold CONT down.
Or you can initialize a whole memory area by repeated DEPOSIT NEXT.
Register display logic
24 different machine registers can be displayed on the REGISTER lamps, by operating the REGISTER SELECT knob and the REG GROUP switch.

Stuff related to "REGISTER SELECT"
IF REG GROUP is not active the registers whose names are printed on the left knob half are displayed.
And if active, the register printed on the right half is selected.
In the example image above: PC on left half, visible if REG GROUP inactive; and BBU on right half.
Many registers are for diagnostics of the electronic and will never be simulated by SimH.
Others may be implemented as my knowledge about the PDP-15 increases.
At the moment these registers are implemented:
| REG GROUP inactive: | |
| AC | accumulator |
| PC | program counter |
| OA | Operand Address (address of exam/deposit, or effective address of last memory referencing operand when executing instructions) |
| MQ | Multiplier Quotient |
| L, SC | Priority Level / Step Counter |
| XR | Index Register |
| LR | Limit Register |
| MO | Memory Out (same as MEMORY BUFFER) |
| REG GROUP active | |
| MDL | Memory Data Lines (same as MEMORY BUFFER) |
| MMA | Memory Address, last used |
| MMB | Memory Buffer (same as MEMORY BUFFER) |
Simulated PDP-11/20 running Papertape BASIC
- Details
- Written by: Administrator
- Parent Category: Projects
- Category: BlinkenBone panel simulations
The PDP-11/20 BlinkenBone GitHub distribution automatically boots into the DEC "Papertape-BASIC" from a simulated high-speed papertape reader.
The simulated PDP-11/20 is quite minimalistic: the system consists just of a PC05 highspeed papertape reader/puncher, and an ASR33 teletype.

Booting into Papertape BASIC
Booting a SimH PDP-11 from papertape is a complicated process, but is performed automatically in the SimH ini-script.
- the papertape bootloader is already "deposit"ed into memory.
- the absolute loader and the BASIC are "punched" one after another to the same papertape file "absloader+basic.ptap"; and that strip is attached to the SimH reader device "PTR".
- the bootloader is started. It reads in the absolute loader from tape and starts him.
- the absolute loader HALTs at address 157500 and waits for the next tape to be inserted.
Since this already on the same strip (=file), a simple CONT is issued. - the absolute loader loads in the BASIC. After success, it is started.
See http://www.avitech.com.au/ptb/ptb.html for more details, this page is very good !

Using the Papertape BASIC
First of all: the manual is in the attachement, see below.
The Basic interpreter is delivered on a papertape strip with ID code "DEC-11-AJPB-D". It can run on a PDP-11 with just 4K of memory, and runs standalone without any operating system.
Therefore there are some limitations:
- Variables may only have single-letter names, or single letter + 1 number (like "N2").
- all input must be given in UPPER case letters (image you're sitting before an ASR33 teletype)
- no string processing, except for printing constant text.
After start the prompt "*O" is shown. This means you can decide what additional options you want to load. A simple "ENTER" chooses all options and all memory to be used.
Primes
To keep the Blinkenlights busy, this BASIC program can be run.
10 REM PRIMES.BAS: PROGRAM TO CALCULATE PRIME NUMBERS |
You don't need to type it in. Just copy the text over the clipboard into the SimH console window.
But wait ...
Load a BASIC program from Papertape
The "Papertape-BASIC" is not only distributed on papertape, it also can load and save program files to/from papertape.
The "primes.bas" example file is part of the distribution. To let BASIC read it from the SimH Paper Tape Reader PTR device:
- HALT and break into Simh
- Put the program strip in the reader:
sim> attach ptr primes.bas - Continue execution of the 11/20.
- Under BASIC, just issue "OLD": the reader starts and reads "primes.bas"
- If you want to read the strip again, you must reset the current reader position back to start:
sim>dep ptr pos 0
See here a complete walk-through:

Save a program to papertape
You can also save your BASIC program to papertape. In this case the Paper Tape Puncher PTP is used:
- Break into SimH and "put an empty strip into the puncher":
sim> attach ptp myprogram.bas - Continue the 11/20 and under BASIC type
SAVE - Break again to SimH and "remove the strip from the puncher":
sim> detach ptp - You now have a file "myprogram.bas" on your disk.
Surprisingly BASIC saves the file as a normal MSDOS/MS-Windows text file: lines are separated with the "CR/LF" byte sequence 0x0D 0x0A.
Since Bill Gates' first product was a BASIC interpreter for ALTAIR, and he knows DEC products very well, this may not be coincidence.
Go for the real thing!
While working with papertape in SimH works fine, it totally misses the physical experience. Nothing can beat
the punching noise, or the view of a strip moving steadily through the reader while zig-zagging in both the source and the destination reservoir.
DEC-11-AJPB-D_PDP-11_BASIC_Programming_Manual_Dec70.pdf -- Manual for PDP-11 Papertape-BASIC (1970)
Simulated PDP-11/20 panel
- Details
- Written by: Administrator
- Parent Category: Projects
- Category: BlinkenBone panel simulations
A journey of a thousand miles begins with a single step
(Laozi)
The virtual PDP-11/20 console panel
I was lucky to borrow a 11/20 from the Computer Museum of GWDG in Göttingen, Germany.
Of course I made immediately another BlinkenBone Java front panel simulation of it:

Real PDP-11/20 below, touch-screen monitor with BlinkenBone simulation sitting above
About the PDP-11/20
The 11/20 is the first PDP-11 build and sold. It was introduced 1970.
On first look - with its DECtape and Papertape periphery - it appears like the follow-on to some PDP-8.
Some unique construction features were dropped in later PDP-11's:
- Lightbulbs in the panel (all later PDP-11s had LEDs)
- Front panel circuit board plugged into the backplane (later the panel was mounted separate from the backplane)
- Switches are those of the PDP-8/e
- CPU is build with hardwired logic (other PDP-11 processors were implemented in micro code, much later then as FPGAs.)
All this makes the 11/20 look like a sucessful prototype. You wouldn't have expected the historic impact of this machine!
![]() |
![]() |
Operation
Since all blinkenlight -PDP-11s have very similar panels, see the PDP-11/40 for a thorough explanation.
Lamps
The ADDRESS and DATA lamps are as on all DEC panels.
The PDP-11/20 is a 16-bit machine. The ADDRESS lamps 17 and 16 have no function, but are always ON, if an address in the IOpage is set.
So addresses 177777..160000 are displayed as 777777..760000.
The PDP-1/20 has no virtual memory: There is no MMU nor I/D data space nor KERNEL/SUPER/USER mode.
Still there are some indicators on the right half, these help track internal processing in "single cycle" mode. This is only needed when debugging errors in the circuitry.
The 11/20 CPU is not implemented with a micro-machine, but with hardwired logic.
So instead of micro-program flow, an opcode is executed in fixed phases, each characerized by diverse "cycle" signals. These are displayed with the lamps:
- FETCH: load opcode from memory
- EXECUTE: run data from registers through the ALU and write back.
- SOURCE/DESTINATION, ADDRESS: additional memory cycles to access operands from memory and index data.
SimH does not simulate any of this, so a fixed pattern of "glowing" lamps is shown on RUN. And the "Single-CYCLE" step mode is not implemented.
Switches
The panel switches have the same shape as those on the PDP-8/e.
The POWER/LOCK, LOAD ADDR, EXAM, DEPOSIT, LOAD, ENABLE/HALT and START work as on every PDP-11.
The S-INST/S-CYCLE switch is has no function: SimH can't single-step the hardwired execution logic. Every CONT in HALT mode performs a single instruction step.
The keylock switch is rotated counter-clockwise by clicking somewhere left of the switch center, and rotated clock-wise by click right of the center.
"LOCK" disables all keys. And setting the switch to "OFF" terminates SimH (almost).
If the PDP-11/20 is a true 16 bit machine, then why has it 18 address switches?
Answer: Forsight (but not enough)! Bits 17 and 16 are "reserved" for later memory expansion. It was planned to expand the 64K address space to 256 KBytes. But the PDP-11 lived much much longer than expected. UNIBUS address space was limited to 18 address bits, but with a local memory bus 22 bits could be addressed. In 1978 the VAX introduced a much greater architecture, the PDP-11 was not further enhanced and starved to death on memory for the next 20 years.
Running a light
DEC documentation does not specify, what in in RUNning state is to be displayed on the DATA lamps, I've been creative here.
But definitely after a HALT opcode register R0 is displayed on DATA.
So the "Running light" program is this:
1 .title PDP-11/20 running light |
Toggle this code in with LOAD ADDR and multiple DEP's.
Start with "LOAD ADDR" and START.
You have to press "CONT" after each iteration.
The distribution provided on GitHub is booting and running a more interesting software: the "1970 Papertape BASIC". See next page!
Playing with the PDP-11/40
- Details
- Written by: Administrator
- Parent Category: Projects
- Category: BlinkenBone panel simulations
First steps:
After starting the script "pdp1140.bat|sh", two application windows appear on your desktop:
- The SimH command window, which is also the serial console of the simulated PDP-11.
After start, it shows the boot prompt of a RT-11 operating system. - The graphical panelsim window.
Initially it shows heavy blinking, as the simulated machine is executing a code loop while it waits for your input.

Arrange these two windows, so you can see both. (And you don't need to know much about PDP-11's, the RT-11 operating system or Blinkenlight panels.)
Fingergrabbing
You now surely want to "Fingergrabbing and pressing the cnoeppkes from the computer" (see the jargon file). Well, try this:
- At first you must activate HALT to stop code execution. On a running PDP-11, all other console switches are ignored.
- Execute single steps through the input code loop, by flipping CONT several times.
- Continue code execution by de-activating HALT and press CONT again.
- Halt the machine again.
- Examine the memory: Enter a address with the data switches, then press LOAD ADRS. After that you may toggle EXAM multiple times. See data appear in the DATA LEDs, and see the address incrementing (always by 2) in the ADDRESS LEDs.
- Deposit (write) something into memory: Enter an address, then do LOAD ADRS. Enter some data, then flip the DEP switch. The data is written into memory. Change the data, and press DEP again to change more memory cells. After that, you want to EXAM than, as described above.
(It very likely that this will ruin the operating system code :-)
Hint: Watch the SimH command window: it will reflect all operations made on the panel !
"Running light"
After destructing RT-11, it's time for some more constructive work.
Let's enter and run the "Hello world" program for Blinkenlight front panels: a running console light!
The corresponding PDP-11 assembler program was compiled with the MACRO-11 cross assembler.
See here spurce code, binary code, and how to enter it over the Blinkenlight panel:
|
PDP-11 assembler program: |
operation on switches |
|
|
activate HALT Start sequence: de-activate HALT |
Check this program again with EXAM operations! While converting octal digits to switch positions, you will make much more errors than you expect (we'll, at least I did ...).
After cross-checking, start the program. You should see a single light running in DATA from right to left.
The trick is using opcode "reset": "Reset" initializes all devices, it needs 70 milliseconds = 1/14 second to do this. In this time, the content of cpu register R0 is visible on the DATA LEDs.
To get a binary counter instead of a running light, replace this line
001004 006100 rol r0 ; data switches=006100, DEP
by this
001004 005200 inc r0 ; data switches=005200, DEP
"Little Gauss"
Here comes another demo you can play: a little MACRO-11 assembler program, which adds the first <n> natural numbers:
sum = 1 + 2 + 3 + ... + n.
See the attachement for a complete listings and instructions how to toggle it in and let it run. Follow these basic steps:
- Toggle in the program starting at address 1000 (octal). It is just 11 opcodes long.
- verify it by EXAMing all opcodes.
- Enter a value for <n> over the SR data switches. Try at first n=100, which is octal 144.
- Start the program from address 1000. It will calculate the sum and HALT then. The resulting sum is show on the DATA LEDs. For n=100, the sum 1 + 2 + 3 .. 100 = 5050, (octal 11672)
- Enter another value for <n> as in step 3, then CONTinue program execution.
(You can tell your audience the story behind: The sum 1 + 2 + 3 + .. + n can quickly be calculated as sum = n*(n+1)/2. This formula was discovered by the 8-year old Carl Friedrich Gauss. He was forced in school to add the numbers 1+2+3+..+100, because a lazy teacher wanted to keep the kids occupied for an hour. Gauss quickly reordered the numbers to
(1+100) + (2+99) + (3+98) ... (50+51) = 101 * 50 = 5050.
and had the result after a few seconds. Hence this formula is named "Little Gauss".





