1. PDP-1 simulator usage¶
- Date:
2020-04-28
- Revision:
$Format:%H$
- Copyright:
See LICENSE.txt for terms of use.
This memorandum documents the PDP-1 simulator.
1.1. Simulator files¶
sim/
scp.h
sim_console.h
sim_defs.h
sim_fio.h
sim_rev.h
sim_sock.h
sim_timer.h
sim_tmxr.h
scp.c
sim_console.c
sim_fio.c
sim_sock.c
sim_timer.c
sim_tmxr.c
sim/pdp1/
pdp1_defs.h
pdp1_clk.c
pdp1_cpu.c
pdp1_dcs.c
pdp1_drm.c
pdp1_dt.c
pdp1_lp.c
pdp1_stddev.c
pdp1_sys.c
1.2. PDP-1 features¶
The PDP-1 is configured as follows:
Device name(s) |
Simulates |
---|---|
|
PDP-1 CPU with up to 64KW of memory | optional automatic multiply/divide | optional 16-channel sequence break system | optional PDP-1D extended features |
|
1Khz time-sharing clock (PDP-1D) |
|
Integral paper tape reader/punch |
|
Console typewriter |
|
Type 62 line printer |
|
Type 24 serial drum |
|
Type 23 parallel drum |
|
Type 550 Microtape (DECtape) |
|
Type 630 Data Communications Subsystem |
The PDP-1 simulator implements the following unique stop conditions:
An unimplemented instruction is decoded, and register
STOP_INST
is setMore than
IND_MAX
indirect addresses are detected during memory reference address decodingMore than
XCT_MAX
nested executes are detected during instruction executionI/O wait, and no I/O operations outstanding (i.e., no I/O completion will ever occur)
A simulated DECtape runs off the end of its reel
The LOAD
command supports RIM format tapes and BLK format tapes.
If the file to be loaded has an extension of .BIN
,
or switch -B
is specified,
the file is assumed to be BLK format;
otherwise, it defaults to RIM format.
LOAD
takes an optional argument that specifies the starting address of the field to be loaded:
LOAD lisp.rim Load RIM format file lisp.rim
LOAD ddt.rim 70000 Load RIM format file ddt.rim into
the field starting at 70000
LOAD -B macro.blk Load BLK format file macro.blk
The DUMP
command is not implemented.
1.2.1. CPU¶
The only CPU options are the presence of hardware multiply/divide and the size of main memory.
SET CPU MDV Enable multiply/divide
SET CPU NOMDV Disable multiply/divide
SET CPU SBS16 Enable 16-channel sequence break system
SET CPU NOSBS16 Disable 16-channel sequence break system
SET CPU PDP1C Set CPU to standard PDP-1C
SET CPU PDP1DS45 Set CPU to PDP-1D, serial# 45 (BBN)
SET CPU PDP1DS48 Set CPU to PDP-1D, serial# 48 (Stanford)
SET CPU 4K Set memory size = 4K
SET CPU 8K Set memory size = 8K
SET CPU 12K Set memory size = 12K
SET CPU 16K Set memory size = 16K
SET CPU 20K Set memory size = 20K
SET CPU 24K Set memory size = 24K
SET CPU 28K Set memory size = 28K
SET CPU 32K Set memory size = 32K
SET CPU 48K Set memory size = 48K
SET CPU 64K Set memory size = 64K
If memory size is being reduced, and the memory being truncated contains non-zero data, the simulator asks for confirmation. Data in the truncated portion of memory is lost. Initial memory size is 64K. Setting the CPU to PDP-1D also enables multiply/divide and the 16-channel sequence break system.
CPU registers include the visible state of the processor as well as the control registers for the interrupt system.
Name |
Size |
Comments |
---|---|---|
|
16 |
Program counter |
|
18 |
Accumulator |
|
18 |
IO register |
|
1 |
Overflow flag |
|
6 |
Program flags<1:6> |
|
6 |
Sense switches<1:6> |
|
16 |
Address switches |
|
18 |
Test word (front panel switches) |
|
1 |
Extend mode |
|
1 |
Ring mode (PDP-1D only) |
|
1 |
Link (PDP-1D #45 only) |
|
1 |
Restrict mode (PDP-1D) |
|
1 |
Restrict memory mask (PDP-1D) |
|
18 |
Restrict trap buffer (PDP-1D #45 only) |
|
2 |
Rename map (PDP-1D #45 only) |
|
18 |
IO status register |
|
1 |
Sequence break enable |
|
1 |
Sequence break request |
|
1 |
Sequence break in progress |
|
16 |
Pending sequence break requests |
|
16 |
Enabled sequence break levels |
|
16 |
Active sequence break levels |
|
1 |
I/O halt in progress |
|
1 |
I/O synchronizer (completion) |
|
16 |
PC prior to last jump or interrupt; most recent PC change first |
|
1 |
Stop on undefined instruction |
|
1 |
Initial state of sequence break enable |
|
1 |
Initial state of extend mode |
|
8 |
Maximum XCT chain |
|
8 |
Maximum nested indirect addresses |
|
8 |
Interrupt character |
The CPU can maintain a history of the most recently executed instructions.
This is controlled by the SET CPU HISTORY
and SHOW CPU HISTORY
commands:
SET CPU HISTORY Clear history buffer
SET CPU HISTORY=0 Disable history
SET CPU HISTORY=n Enable history, length = n
SHOW CPU HISTORY Print CPU history
SHOW CPU HISTORY=n Print first n entries of CPU history
The maximum length for the history is 65536 entries.
If the 16-channel sequence break system is enabled, devices can be assigned to any break level between 0 (the default) and 15, with the following command:
SET <dev> SBSLVL=n Assign device to sequence break level n
Because each PDP-1 configuration was unique, there are no default assignments for the 16-channel sequence break system.
1.2.2. Programmed I/O devices¶
1.2.2.1. Paper tape reader (PTR)¶
The paper tape reader (PTR) reads data from or a disk file. The POS register specifies the number of the next data item to be read. Thus, by changing POS, the user can backspace or advance the reader.
The paper tape reader supports the BOOT
command.
BOOT PTR
copies the RIM loader into memory and starts it running.
BOOT PTR
loads into the field selected by TA<0:3>
(the high order four bits of the address switches).
The paper tape reader recognizes one switch at ATTACH
time:
ATT -A PTR <file> Convert input characters from ASCII
By default, the paper tape reader does no conversions on input characters.
The paper tape reader implements these registers:
Name |
Size |
Comments |
---|---|---|
|
8 |
Last data item processed |
|
1 |
Device done flag |
|
1 |
Return restart pulse flag |
|
32 |
Position in the input file |
|
24 |
Time from I/O initiation to interrupt |
|
1 |
Stop on I/O error |
Error handling is as follows:
Error |
|
Processed as |
---|---|---|
not attached |
1 |
Report error and stop |
0 |
Out of tape |
|
end of file |
1 |
Report error and stop |
0 |
Out of tape |
|
OS I/O error |
x |
Report error and stop |
1.2.2.2. Paper tape punch (PTP)¶
The paper tape punch (PTP) writes data to a disk file.
The POS register specifies the number of the next data item to be written.
Thus, by changing POS, the user can backspace or advance the punch.
The default position after ATTACH
is to position at the end of an existing file.
The paper tape punch recognizes two switches at ATTACH
time:
ATT -A PTP <file> Output characters as ASCII text
ATT -N PTP <file> Create a new (empty) output file
By default, the paper tape punch punches files with no conversions.
The paper tape punch implements these registers:
Name |
Size |
Comments |
---|---|---|
|
8 |
Last data item processed |
|
1 |
Device done flag |
|
1 |
Return restart pulse flag |
|
32 |
Position in the output file |
|
24 |
Time from I/O initiation to interrupt |
|
1 |
Stop on I/O error |
Error handling is as follows:
Error |
|
Processed as |
---|---|---|
not attached |
1 |
Report error and stop |
0 |
Out of tape |
|
OS I/O error |
x |
Report error and stop |
1.2.2.3. Console typewriter input (TTI), output (TTO)¶
The Typewriter is a half-duplex electric typewriter (originally a Friden Flexowriter, later a Sorobon-modified IBM B). It has only a single buffer and a single carriage state but distinct input and output done and interrupt flags. The typewriter input (TTI) polls the console keyboard for input. The typewriter output (TTO) writes to the simulator console window.
The Typewriter recognizes one option:
SET TTO ET Expensive Typewriter mode
SET TTO NOET Normal mode
In Expensive Typewriter mode,
ribbon changes are output as strings ([red]
, [black]
) to indicate which mode the program is in
(red
for command, black
for text).
In normal mode, ribbon changes are ignored.
The typewriter input implements these registers:
Name |
Size |
Comments |
---|---|---|
|
6 |
Typewriter buffer (shared) |
|
1 |
Upper case/lower case state (shared) |
|
1 |
Input ready flag |
|
32 |
Number of characters input |
|
24 |
Keyboard polling interval |
The typewriter output implements these registers:
Name |
Size |
Comments |
---|---|---|
|
6 |
Typewriter buffer (shared) |
|
1 |
Upper case/lower case state (shared) |
|
1 |
Return restart pulse flag |
|
1 |
Output done flag |
|
32 |
Number of characters output |
|
24 |
Time from I/O initiation to interrupt |
1.2.2.4. Type 62 line printer (LPT)¶
The line printer (LPT) writes data to a disk file.
The POS register specifies the number of the next data item to be written.
Thus, by changing POS, the user can backspace or advance the printer.
The default position after ATTACH
is to position at the end of an existing file.
A new file can be created if you attach with the -N
switch.
The line printer can be disabled and enabled with the SET LPT DISABLED
and SET LPT ENABLED
commands, respectively.
The line printer implements these registers:
Name |
Size |
Comments |
---|---|---|
|
8 |
Last data item processed |
|
1 |
Printing done flag |
|
1 |
Spacing done flag |
|
1 |
Return restart pulse flag |
|
6 |
Print buffer pointer |
|
32 |
Position in the output file |
|
24 |
Time from I/O initiation to interrupt |
|
1 |
Stop on I/O error |
|
8 |
Line buffer |
Error handling is as follows:
Error |
|
Processed as |
---|---|---|
not attached |
1 |
Report error and stop |
0 |
Out of tape or paper |
|
OS I/O error |
x |
Report error and stop |
1.2.2.5. Type 550/555 Microtape (DECtape) (DT)¶
The PDP-1 uses the Type 550 Microtape (later renamed DECtape), a programmed I/O controller. PDP-1 DECtape format has 4 18b words in its block headers and trailers.
DECtapes drives are numbered 1-8; in the simulator, drive 8 is unit 0. DECtape options include the ability to make units write enabled or write locked.
SET DTn WRITEENABLED Set unit n write enabled
SET DTn LOCKED Set unit n write locked
Units can also be set ENABLED
or DISABLED
.
The DECtape controller can be disabled and enabled with the SET DT DISABLED
and SET DT ENABLED
commands, respectively.
The Type 550 supports PDP-8 format,
PDP-11 format,
and 18b format DECtape images.
ATTACH
assumes the image is in 18b format;
the user can other choices with switches:
|
PDP-8 format |
|
PDP-11 format |
|
Autoselect based on file size |
The DECtape controller is a data-only simulator;
the timing and mark track,
and block header and trailer,
are not stored.
Thus, the WRITE TIMING AND MARK TRACK
function is not supported;
the READ ALL
function always returns the hardware standard block header and trailer;
and the WRITE ALL
function dumps non-data words into the bit bucket.
The DECtape controller implements these registers:
Name |
Size |
Comments |
---|---|---|
|
12 |
Status register A |
|
12 |
Status register B |
|
18 |
Data buffer |
|
1 |
DECtape flag |
|
1 |
Block end flag |
|
1 |
Error flag |
|
31 |
Time between lines |
|
31 |
Time to decelerate to a full stop |
|
2 |
Read/write command substate |
|
32 |
Position, in lines, units 0-7 |
|
18 |
Unit state, units 0-7 |
|
1 |
Stop on off-reel error |
It is critically important to maintain certain timing relationships among the DECtape parameters, or the DECtape simulator will fail to operate correctly.
LTIME
must be at least 6DCTIME
needs to be at least 100 timesLTIME
Acceleration time is set to 75% of deceleration time.
1.2.2.6. PDP-1D timesharing clock (CLK)¶
The PDP-1D implements a timesharing clock, which operates at 1Khz. The clock has a readable counter and generates interrupts at 32 ms and 1 minute intervals. There is no other visible state. The clock is disabled by default.
The clock implements these registers:
Name |
Size |
Comments |
---|---|---|
|
16 |
Clock counter, range 0-5999910 |
The clock requires the 16-channel sequence break system and is assigned to two different SBS levels:
SET CLK SBS32MS=n Assign 32 msec interrupt to SBS level n
SET CLK SBS1MIN=n Assign 1 minute interrupt to SBS level n
1.2.2.7. Type 630 data communications subsystem (DCS, DCSL)¶
The Type 630 data communications subsystem provides up to 32 asynchronous interfaces.
The Type 630 consists of two independent devices: DCS for the scanner, and DCSL for the individual lines.
The terminal multiplexer performs input and output through Telnet sessions connected to a user-specified port.
The ATTACH
command specifies the port to be used:
ATTACH DCS <port> Set up listening port
where <port>
is a decimal number between 1 and 65535 that is not being used for other TCP/IP activities.
The number of lines can be changed with SET DCL LINES
command:
SET DCS LINES=n Set number of lines to n, where n is 1-32
Each line (each of unit of DCSL) can be set to one of four modes: UC
, 7P
, 7B
, or 8B
.
Mode |
Input characters |
Output characters |
---|---|---|
|
Lowercase converted to uppercase, high-order bit cleared |
Lowercase converted to uppercase, high-order bit cleared, non-printing characters suppressed |
|
High-order bit cleared |
High-order bit cleared, non-printing characters suppressed |
|
High-order bit cleared |
High-order bit cleared |
|
No changes |
No changes |
The default mode is UC
.
Finally, each line supports output logging.
The SET DCSLn LOG
command enables logging on a line:
SET DCSLn LOG=filename Log output of line n to filename
The SET DCSLn NOLOG
command disables logging and closes the open log file, if any.
Once DCS is attached and the simulator is running,
the multiplexer listens for connections on the specified port.
It assumes that the incoming connections are Telnet connections.
The connections remain open until disconnected either by the Telnet client,
a SET DCS DISCONNECT
command,
or a DETACH DCS
command.
Other special commands:
SHOW DCS CONNECTIONS Show current connections
SHOW DCS STATISTICS Show statistics for active connections
SET DCSLn DISCONNECT Disconnects the specified line
The multiplexer scanner (DCS) implements these registers:
Name |
Size |
Comments |
---|---|---|
|
8 |
Input buffer, lines 0 to 31 |
|
1 |
Line ready flag, lines 0 to 31 |
|
1 |
Scanner ready flag |
|
5 |
Scanner line number |
|
5 |
Output line number |
The individual lines (DCSL) implement these registers:
Name |
Size |
Comments |
---|---|---|
|
24 |
Time from I/O initiation to interrupt, lines 0 to 31 |
The multiplexer does not support save and restore. All open connections are lost when the simulator shuts down or DSC is detached.
1.2.3. Drums¶
The PDP-1 supports two drums: the Type 23 parallel drum (DRP) and the Type 24 serial drum (DRM). Both use device addresses 061-064; accordingly, only one can be enabled at a time. By default, the Type 24 serial drum is enabled, and the Type 23 parallel drum is disabled. The PDP-1D requires the Type 23 parallel drum.
1.2.3.1. Type 24 serial drum (DRM)¶
The serial drum (DRM) implements these registers:
Name |
Size |
Comments |
---|---|---|
|
9 |
Drum address (sector number) |
|
16 |
Current memory address |
|
1 |
Device done flag |
|
1 |
Error flag |
|
32 |
Write lock switches |
|
24 |
Rotational latency, per word |
|
1 |
Stop on I/O error |
Error handling is as follows:
Error |
|
Processed as |
---|---|---|
not attached |
1 |
Report error and stop |
0 |
Drum not ready |
Drum data files are buffered in memory; therefore, end of file and OS I/O errors cannot occur.
1.2.3.2. Type 23 parallel drum (DRP)¶
The parallel drum (DRP) implements these registers:
Name |
Size |
Comments |
---|---|---|
|
12 |
Track address |
|
5 |
Read field |
|
1 |
Read enable flag |
|
5 |
Write field |
|
1 |
Write enable flag |
|
16 |
Current memory address |
|
12 |
Word count |
|
1 |
Device busy flag |
|
1 |
Error flag |
|
24 |
Rotational latency, per word |
|
1 |
Stop on I/O error |
Error handling is as follows:
Error |
|
Processed as |
---|---|---|
not attached |
1 |
Report error and stop |
0 |
Drum not ready |
Drum data files are buffered in memory; therefore, end of file and OS I/O errors cannot occur.
1.3. Symbolic display and input¶
The PDP-1 simulator implements symbolic display and input. Display is controlled by command-line switches:
|
Display as ASCII character |
|
Display as three packed FIODEC characters |
|
Display instruction mnemonics |
Input parsing is controlled by the first character typed in or by command-line switches:
|
ASCII character |
|
Three packed FIODEC characters |
Alphabetic |
Instruction mnemonic |
Numeric |
Octal number |
Instruction input uses modified PDP-1 assembler syntax.
There are six instruction classes:
memory reference,
shift,
skip,
operate,
IOT
, and
LAW
.
Memory reference instructions have the format
memref {I} address
where I
signifies indirect reference.
The address
is an octal number in the range 0 - 0177777.
Shift instructions have the format
shift shift_count
The shift_count
is an octal number in the range 0-9.
Skip instructions consist of single mnemonics, e.g., SZA
, SZS4
.
Skip instructions may be or’d together
skip skip skip...
The sense of a skip
can be inverted by including the mnemonic I
.
Operate instructions consist of single mnemonics, e.g., CLA
, CLI
.
Operate instructions may be or’d together
opr opr opr...
IOT
instructions consist of single mnemonics, e.g., TYI
, TYO
.
IOT
instructions may include an octal numeric modifier or the modifier I
:
iot modifier
The simulator does not check the legality of skip, operate, or IOT
combinations.
Finally, the LAW
instruction has the format
LAW {I} immediate
where immediate
is in the range 0 to 07777.
1.4. Character sets¶
The PDP-1’s first console was a Frieden Flexowriter;
its character encoding was known as FIODEC.
The PDP-1’s line printer used a modified Hollerith character set.
The following table provides equivalences between ASCII characters and the PDP-1’s I/O devices.
In the console table, UC
stands for uppercase.
The console table also applies to ASCII mode for the paper tape reader and punch.
ASCII |
PDP-1 console |
PDP-1 line printer |
---|---|---|
000 - 007 |
none |
none |
BS |
075 |
none |
TAB |
036 |
none |
012 - 013 |
none |
none |
FF |
013 |
none |
CR |
077 |
none |
016 - 037 |
none |
none |
Space |
000 |
000 |
|
{OR} |
none |
|
|
none |
|
{IMPLIES} |
none |
|
none |
none |
|
none |
none |
|
{AND} |
none |
|
|
none |
|
057 |
057 |
|
055 |
055 |
|
{TIMES} |
072 |
|
|
074 |
|
033 |
033 |
|
054 |
054 |
|
073 |
073 |
|
021 |
021 |
|
020 |
020 |
|
001 |
001 |
|
002 |
002 |
|
003 |
003 |
|
004 |
004 |
|
005 |
005 |
|
006 |
006 |
|
007 |
007 |
|
010 |
010 |
|
011 |
011 |
|
none |
none |
|
none |
none |
|
|
034 |
|
|
053 |
|
|
034 |
|
|
037 |
|
{MID DOT} 040 |
{MID DOT} 040 |
|
|
061 |
|
|
062 |
|
|
063 |
|
|
064 |
|
|
065 |
|
|
066 |
|
|
067 |
|
|
070 |
|
|
071 |
|
|
041 |
|
|
042 |
|
|
043 |
|
|
044 |
|
|
045 |
|
|
046 |
|
|
047 |
|
|
050 |
|
|
051 |
|
|
022 |
|
|
023 |
|
|
024 |
|
|
025 |
|
|
026 |
|
|
027 |
|
|
030 |
|
|
031 |
|
|
none |
|
{OVERLINE} 056 |
{OVERLINE} 056 |
|
|
none |
|
{UP ARROW} UC+011 |
{UP ARROW} 035 |
|
|
|
` |
{RT ARROW} |
036 |
|
061 |
none |
|
062 |
none |
|
063 |
none |
|
064 |
none |
|
065 |
none |
|
066 |
none |
|
067 |
none |
|
070 |
none |
|
071 |
none |
|
041 |
none |
|
042 |
none |
|
043 |
none |
|
044 |
none |
|
045 |
none |
|
046 |
none |
|
047 |
none |
|
050 |
none |
|
051 |
none |
|
022 |
none |
|
023 |
none |
|
024 |
none |
|
025 |
none |
|
026 |
none |
|
027 |
none |
|
030 |
none |
|
031 |
none |
|
none |
none |
|
|
076 |
|
none |
none |
|
|
013 |
DEL |
075 |
none |