d i g i t a l digital equipment corporation • maynard, massachusetts
ADDRESS  
POWER
LOCK
OFF
DATA  
USER I
SUPER I
KERNEL I
PROG PHY
USER D
SUPER D
KERNEL D
CONS PHY
DATA PATHS
µ ADRS FPP/CPU
BUS REG
DISPLAY REGISTER
ADRS ERR
RUN
PAUSE
MASTER
USER
SUPER
KERNEL
DATA
17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 LOAD ADRS EXAM CONT
ENABLE
HALT
S INST
S BUS
START DEP REG EXAM REG DEP







PDP‑11/45 Emulator

This emulator began as a personal project. Years ago I was a programmer for RSTS/E on a PDP‑11/45, and I vividly remembered the console’s idle loop light pattern — but not quite how it looked. With real hardware long gone, I decided to recreate it in software.

My initial plan was to emulate the PDP‑11/45, but the expanded memory of the PDP‑11/70 (nearly 4 MB!) proved irresistible. The result was a PDP‑11/70 emulator, later joined by a PDP‑11/45 version and even a PDP‑10.

The core objective was met: I can now see the RSTS/E console light pattern again. Interestingly, later releases (such as v9.6) changed the pattern, and other operating systems have their own distinctive styles. RSX and BSD 2.11 show lively variations, while Unix V5 and Ultrix keep the lights almost static, reflecting heavy use of WAIT mode.

Collecting the operating systems themselves was a challenge. One highlight was tracking down RSTS/E V06C, which has its own story.

Many of these systems include source code, offering fascinating insights into their design. Their influence on later computing is profound — Unix in particular feels familiar to modern administrators. I sometimes wonder if encountering Ultrix earlier might have steered my career differently.

The emulator boots with a custom PDP‑11 program that drives its own light patterns. Loaded at address 120000, it includes a LIGHTS command that cycles through virtual addresses with WAIT instructions, displaying the contents of R0 and the current instruction address. You can also use BOOT to start guest operating systems, or ODT to launch the Octal Debugging Tool.

Original PDP‑11s had no BIOS. Booting meant toggling in a tiny bootstrap loader from the front panel — unless you were lucky enough to have residual code in magnetic core memory. Below is an example bootstrap for the RK05 disk, where the value at address 1002 selects the unit (rk0, rk1, rk2, etc.).

Address  Data    Code           Switch commands
                               HALT, 001000, LOAD ADDRESS
001000   012737  mov #unit,rkda 012737, DEPOSIT
001002   000000                 000000, DEPOSIT (020000 for rk1, 040000 for rk2, etc)
001004   177412                 177412, DEPOSIT
001006   012700  mov #rkwc,r0   012700, DEPOSIT
001010   177406                 177406, DEPOSIT
001012   012710  mov #-256,(r0) 012710, DEPOSIT
001014   177400                 177400, DEPOSIT
001016   012740  mov #5,-(r0)   012740, DEPOSIT
001020   000005                 000005, DEPOSIT
001022   105710  tstb (r0)      105710, DEPOSIT
001024   100376  bpl .-2        100376, DEPOSIT
001026   005007  clr pc         005007, DEPOSIT
                               001000, LOAD ADDRESS, ENABLE, START

For fun, here’s a simple “light chaser” program you can toggle in:

Address  Data    Code        Switch commands
                            HALT, 001000, LOAD ADDRESS
001000   012700  mov #1,r0   012700, DEPOSIT
001002   000001              000001, DEPOSIT
001004   006100  rol r0      006100, DEPOSIT
001006   000005  reset       000005, DEPOSIT
001010   000775  br .-4      000775, DEPOSIT
                            001000, LOAD ADDRESS, ENABLE, START

To restart the emulator’s initial boot code (if not overwritten), use:

HALT, 120000, LOAD ADDRESS, ENABLE, START

Curious how it all works? The source is available on GitHub. The main JavaScript files are pdp11.js, fpp.js, and iopage.js.

Happy emulating!

Paul Nankervis

Guest Operating Systems

Disk OS Notes
RK0Unix V5Boot using: unix, then login as root
RK1RT‑11 v4.0The smallest OS here
RK2RSTS V06C‑03Login as 1,2 (password SYSTEM) or 11,70 (password PDP)
RK3XXDPDiagnostic OS and utilities
RK4RT‑11 3BDistribution for RT‑11 Version 3B
TM0RSTS 4B‑17Boot ROLLIN from TM0, restore DK0, then reboot. Default login 1,2 (SYSTEM) or 11,70 (PDP).

Example boot of Unix V5

Boot> boot rk0
@unix

login: root
# cat /etc/passwd
root::0:1::/:
daemon::1:1::/bin:
bin::3:1::/bin:
# who
root    tty8 Mar 21 12:09
# chdir /usr/sys/ken
# pwd
../usr/sys/ken
# ls -al
total 121
drwxr-xr-x  2 bin       352 Nov 26 18:13 .
drwxr-xr-x  5 bin       384 Nov 26 18:13 ..
-rw-r--r--  1 bin      3855 Nov 26 18:13 alloc.c
-rw-r--r--  1 bin      2159 Nov 26 18:13 clock.c
-rw-r--r--  1 bin      2662 Nov 26 18:13 fio.c
-rw-r--r--  1 bin      2941 Nov 26 18:13 iget.c
-rw-r--r--  1 bin      2674 Nov 26 18:13 main.c
...
# ls -al /usr/games
total 64
drwxr-xr-x  2 bin       144 Nov 26 18:13 .
drwxr-xr-x 14 bin       224 Nov 26 18:13 ..
-rwxr-xr-x  1 bin      1562 Nov 26 18:13 bj
-rwxr-xr-x  1 bin     16268 Nov 26 18:13 chess
-rwxr-xr-x  1 bin      2468 Nov 26 18:13 cubic
-rwxr-xr-x  1 bin       624 Nov 26 18:13 moo
-rwxr-xr-x  1 bin      2192 Nov 26 18:13 ttt
-rw-rw-rw-  1 bin       294 Nov 26 18:13 ttt.k
-rwxr-xr-x  1 bin      5386 Nov 26 18:13 wump
# ls -al /bin
total 339
drwxr-xr-x  2 bin       944 Nov 26 18:13 .
drwxr-xr-x  9 bin       160 Jan 29 16:14 ..
-rwxr-xr-x  1 bin      1514 Nov 26 18:13 ar
-rwxr-xr-x  1 bin      7308 Nov 26 18:13 as
-rwxr-xr-x  1 bin      6042 Nov 26 18:13 bas
-rwxr-xr-x  1 bin       152 Nov 26 18:13 cat
-rwxr-xr-x  1 bin      5668 Nov 26 18:13 cc
....
# ls -al /usr/source/s2
total 281
drwxr-xr-x  2 bin       848 Jan  2 19:36 .
drwxr-xr-x  7 bin       112 Nov 26 18:13 ..
-rw-r--r--  1 bin      4233 Nov 26 18:13 mail.c
-rw-r--r--  1 bin       588 Nov 26 18:13 mesg.s
-rw-r--r--  1 bin      1088 Nov 26 18:13 mkdir.s
-rw-r--r--  1 bin      6922 Nov 26 18:13 mkfs.c
-rw-r--r--  1 bin       563 Nov 26 18:13 mknod.c
...
# chdir /
# cal 10 1981
Oct 1981
S  M Tu  W Th  F  S
1  2  3
4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
# bas
print sqr(2)
1.414213562
10 print "Calculating e"
20 p = 20
30 k = 1
40 e = 0
50 for x=1 p
60 e = e + 1/k
70 k = k * x
80 next x
90 print "e=" e " (" exp(1) ")"
run
Calculating e
e=2.718281828 (2.718281828)
^D
# cat > hello.c
main(argc, argv)
char **argv;
{
printf("Hello world\n");
}
^D
# cc hello.c
# a.out
Hello world
# cat > pi.f
c PI via Nilakantha series: 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7*8) ...
      double precision pi, n, d
      pi = 3.0
      n = 4.0
      d = 2.0
      do 25 i=1,3000
        pi = pi + n / (d * (d + 1.0) * (d + 2.0))
        d = d + 2.0
        n = -n
 25     continue
      write(6,70) pi
 70   format('PI is approximately ', d2.16)
      end
^D
# fc pi.f
# a.out
PI is approximately 0.3141592653580503d+01
#

Example boot of RT11 v4.0

Boot> boot rk1
RT-11SJ  V04.00C

.D 56=5015

.TYPE V4USER.TXT
Welcome to RT-11 Version 4. RT-11 V04 provides new hardware support
and some major enhancements over Version 3B.

Please use the HELP command;  it describes the new options in many
of the utilities.

If you are using a terminal that requires fill characters,
modify location 56 with a Deposit command before proceeding with
system installation. LA36 DECwriter II and VT52 DECscope terminals
do NOT require such modification.

.D 56=0

.DIR

SWAP  .SYS    25  01-Feb-82      RT11BL.SYS    65  01-Feb-82
RT11SJ.SYS    67  01-Feb-82      RT11FB.SYS    80  01-Feb-82
...
DISMT2.COM     8  01-Feb-82      DUNGEO.COM     1  07-Jun-86
DSAVE .DAT    10  07-Jun-86      ADVENT.DOC     4  20-Jul-85
DUNGEO.SAV   216  07-Jun-86      DINDX .DAT    20  07-Jun-86
DTEXT .DAT   383  07-Jun-86      ADVENT.SAV    93  20-Jul-85
ADVENT.VAR    22  20-Jul-85      ADVTXT.TXT   125  20-Jul-85
ODT11 .MAC    61  31-Oct-74      ANIMAL.SAV    22  02-Oct-85
BLKJAK.SAV    20  02-Nov-85      FORTH .MAC   146
RTLEM .MAC   363  06-Sep-73      BOOT  .MAC    26  24-Mar-75
 118 Files, 3392 Blocks
 1370 Free blocks

.R DUNGEO
Welcome to Dungeon.                     This version created 10-AUG-78.
You are in an open field west of a big white house with a boarded
front door.
There is a small mailbox here.
>OPEN MAILBOX
Opening the mailbox reveals:
  A leaflet.
>READ LEAFLET
Taken.
                    Welcome to Dungeon!

   Dungeon is a game of adventure, danger, and low cunning.  In it
you will explore some of the most amazing territory ever seen by mortal
man.  Hardened adventurers have run screaming from the terrors contained
within.

   In Dungeon, the intrepid explorer delves into the forgotten secrets
of a lost labyrinth deep in the bowels of the earth, searching for
vast treasures long hidden from prying eyes, treasures guarded by
fearsome monsters and diabolical traps!

   No DECsystem should be without one!

   Dungeon was created at the Programming Technology Division of the MIT
Laboratory for Computer Science by Tim Anderson, Marc Blank, Bruce
Daniels, and Dave Lebling.  It was inspired by the Adventure game of
Crowther and Woods, and the Dungeons and Dragons game of Gygax
and Arneson.  The original version was written in MDL (alias MUDDLE).
The current version was translated from MDL into FORTRAN IV by
a somewhat paranoid DEC engineer who prefers to remain anonymous.

   On-line information may be obtained with the commands HELP and INFO.
>QUIT
Your score would be   0 [total of 560 points], in    1 move.
This gives you the rank of beginner.
Do you wish to leave the game?
Y

.MAC RTLEM
ERRORS DETECTED:  0
.LINK RTLEM
.RUN RTLEM
... attempt to land the lunar module using the mouse as a light pen - goodluck!

Example boot of RSTS V06C-03

Boot> boot rk2

RSTS V06C-03 Vixen (DK2)

Option: <LF>

You currently have: JOB MAX = 31, SWAP MAX = 28K.

You currently have crash dump disabled.

DD-MMM-YY? 31-OCT-76
12:00 PM? 9:03
INIT    V06C-03 RSTS V06C-03 Vixen

Command File Name?
DETACHING...

I11/70
Password: PDP

Ready

DIR
 Name .Ext  Size    Prot   Date       SY:[11,70]
ACEY  .BAS     5   < 60> 31-Oct-76
TREK  .BAS    16   < 60> 31-Oct-76
TREK  .DOC     9   < 60> 31-Oct-76
ANIMAL.BAS     5   < 60> 31-Oct-76
STRTRK.BAS    27   < 60> 31-Mar-81
STRTR1.BAS     9   < 60> 31-Mar-81
ADVENT.DOC     4   < 60> 20-Jul-85
ADVENT.SAV    93   <124> 20-Jul-85
ADVENT.VAR    22   < 60> 20-Jul-85
ADVTXT.TXT   125   < 60> 20-Jul-85
SYSMAC.SML    42   < 60> 13-Mar-77
HELLO .MAC     1   < 60> 13-Mar-77
PRIME .BAS     1   < 60> 24-Mar-76
PI    .BAS     1   < 60> 24-Mar-76
BOOT  .MAC    26   < 60> 01-Jan-76

Total of 386 blocks in 15 files in SY:[11,70]

Ready

RUN PI
3.14159265358979

Ready

RUN ADVENT

WELCOME TO ADVENTURE!!  WOULD YOU LIKE INSTRUCTIONS?

NO
YOU ARE STANDING AT THE END OF A ROAD BEFORE A SMALL BRICK BUILDING.
AROUND YOU IS A FOREST.  A SMALL STREAM FLOWS OUT OF THE BUILDING AND
DOWN A GULLY.

E
YOU ARE INSIDE A BUILDING, A WELL HOUSE FOR A LARGE SPRING.

THERE ARE SOME KEYS ON THE GROUND HERE.

THERE IS A SHINY BRASS LAMP NEARBY.

THERE IS FOOD HERE.

THERE IS A BOTTLE OF WATER HERE.

GET FOOD
OK

QUIT
DO YOU REALLY WANT TO QUIT NOW?

Y
OK
YOU SCORED  32 OUT OF A POSSIBLE 350, USING    3 TURNS.
YOU ARE OBVIOUSLY A RANK AMATEUR.  BETTER LUCK NEXT TIME.
TO ACHIEVE THE NEXT HIGHER RATING, YOU NEED  4 MORE POINTS.

Ready

RUN ACEY
                          ACEY DUCEY CARD GAME
               CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY


ACEY-DUCEY IS PLAYED IN THE FOLLOWING MANNER
THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP
YOU HAVE AN OPTION TO BET OR NOT BET DEPENDING
ON WHETHER OR NOT YOU FEEL THE CARD WILL HAVE
A VALUE BETWEEN THE FIRST TWO.
IF YOU DO NOT WANT TO BET, INPUT A 0
YOU NOW HAVE 100 DOLLARS.

HERE ARE YOUR NEXT TWO CARDS:
 4
 5

WHAT IS YOUR BET? 100
 9
SORRY, YOU LOSE

SORRY, FRIEND, BUT YOU BLEW YOUR WAD.

TRY AGAIN (YES OR NO)? NO

O.K., HOPE YOU HAD FUN!

Ready

SYSTAT

RSTS V06C-03 Vixen status at 31-Oct-76, 09:05 AM Up: 2:34

Job    Who    Where    What    Size    State    Run-Time   RTS
 1    [OPR]   Det     ERRCPY    5K     SR            5.0  BASIC
 2    [SELF]  KB0     SYSTAT    8K     RN Lck        2.1  BASIC

Busy Devices: None

Disk Structure:
Disk    Open    Free    Cluster Errors  Name    Comments
DK2       3     324        1      0     VIXEN   Pub, DLW

Small   Large   Jobs    Hung TTY's      Errors
380       1      2/2        0              0

Run-Time Systems:
 Name   Ext       Size  Users   Comments
BASIC   BAC     16(16)K   2     Perm, Addr:26, KBM, CSZ
RSX     TSK      2(28)K   0     Non-Res, KBM
RT11    SAV      4(28)K   0     Temp, Addr:66, KBM, CSZ, EMT:255
RMS11   TSK      4(28)K   0     Non-Res

Message Receivers:
 Name   Job     Msgs    Max     Senders
ERRLOG   1       0      40      Priv

Ready

BYE/Y
Saved all disk files; 388 blocks in use, 112 free
Job 2 User 11,70 logged off KB0 at 31-Oct-76 09:05 AM
System RSTS V06C-03 Vixen
Run time was 2.7 seconds
Elapsed time was 2 minutes
Good morning

Example boot of RSTS 4B-17

Boot> boot tm0

ROLLIN V07

#DK:<MT:VIXEN/REW
END-OF-FILE DURING READ, TYPE
M TO MOUNT ANOTHER REEL, OR K TO KILL REQUEST: k

#/BO:DK:

RSTS V04B-17 VIXEN

OPTION? <LF>
DD-MON-YY? 24-MAR-75
HH:MM? 9:21
VIXEN  - SYSTEM PACK MOUNTED
ENABLE CRASH DUMP? N
CHAIN "INIT"
CATASTROPHIC ERROR
PROGRAM LOST-SORRY
I/O CHANNEL NOT OPEN

Ready

SYSTEM INITIALIZATION PROGRAM

END OF FILE ON DEVICE - INIT ASSUMED COMPLETE

Ready

CAT
LOGIN .BAS       7       60     31-Oct-71 31-Oct-71 06:42 AM
LOGIN .BAC       15      60     31-Oct-71 31-Oct-71 06:42 AM
LOGOUT.BAS       7       60     31-Oct-71 31-Oct-71 06:42 AM
LOGOUT.BAC       15      60     31-Oct-71 31-Oct-71 06:42 AM
PIP   .BAS       18      60     31-Oct-71 31-Oct-71 06:42 AM
PIP   .BAC       23      40     31-Oct-71 31-Oct-71 06:42 AM
SYSTAT.BAS       12      60     31-Oct-71 31-Oct-71 06:42 AM
SYSTAT.BAC       19      168    31-Oct-71 31-Oct-71 06:42 AM
...

Ready

RUN TTYSET
'TTYSET' TERMINAL CHARACTERISTICS PROGRAM
? LC
? ^Z

Ready

run utilty
'UTILTY' SYSTEM UTILITY PROGRAM
? LOGINS
? HELP
COMMANDS ARE:
 MOUNT DEV:ID           DISMOUNT DEV:
 LOCK DEV:              UNLOCK DEV:
 NO LOGINS              LOGINS
 CLEAN DEV:             KILL JOB#
 SEND KBN: STRING       FORCE KBN: [^]STRING
 CHANGE [ACCT]PASSWORD  QUOTA [ACCT] QUOTA
 ZERO DEV:[ACCT]        HANGUP KBN:
 DATE DD-MMM-YY         TIME HH:MM
? ^Z

Ready

run pip
PIP - RSTS V04B-17 VIXEN
#acct.sys
11,70,PDP,0,2,PDP 11/70 EMULATOR
#^Z

Ready

run systat
OUTPUT STATUS TO? kb:

RSTS V04B-17 VIXEN STATUS ON 24-Mar-75 AT 09:22 AM UP: 1:07

JOB    WHO      WHERE    WHAT   SIZE    STATE     RUN-TIME
 1     1,2       KB0    SYSTAT   6K     RN             0.1

BUSY DEVICES: NONE

DISK STRUCTURE:
DISK    OPEN     FREE   CLUSTER ERRORS  COMMENTS
DK0      0       3185     1       0     PUBLIC

SMALL  LARGE   ERRORS  HUNG TTY'S
 69     0      0        0

Ready

bye
CONFIRM: y
SAVED ALL DISK FILES; 782 BLOCKS IN USE
JOB 1 USER 1,2 LOGGED OFF KB0 AT 24-Mar-75 09:22 AM
SYSTEM RSTS V04B-17 VIXEN
RUN TIME WAS .1 SECONDS
ELAPSED TIME WAS 1 MINUTE, 20 SECONDS
GOOD MORNING

HELLO

RSTS V04B-17 VIXEN  JOB 1  KB0  24-Mar-75  09:24 AM
#11,70
PASSWORD: PDP
RSTS V4B-17 IS NOW AVAILABLE...

NEW OR OLD--
^C

Ready

CAT
PRIME .BAS       1       60     31-Oct-71 31-Oct-71 06:43 AM
PI    .BAS       1       60     31-Oct-71 31-Oct-71 06:43 AM

Ready

OLD PI

Ready

LIST
PI      09:25 AM        24-Mar-75
10 REM CALCULATE PI
20 P = 0
30 P1 = 1
40 FOR K%=0% TO 10%
50 P = P + 1.0/P1 * (4.0/(8%*K% + 1%) - 2.0/(8%*K% + 4%) - 1.0/(8%*K% +5%) - 1.0/(8%*K% + 6%))
60 P1 = P1 * 16.0
70 NEXT K%
80 PRINT USING "#.##############",P
99 END

Ready

RUN
PI      09:25 AM        24-Mar-75
3.14159265358979

Ready

Software Sources

The software used in this emulator has been sourced from many places on the Internet and unfortunately many of these seem to have disappeared. If you are looking for something I would suggest the following main sites...

Github