The history of computing technology can be roughly divided into three eras: the era of mainframes, minicomputers and microcomputers. Minicomputers became an important link between the first mainframes and the ubiquitous microcomputers of today. This is the story of the PDP-11, the most influential and successful minicomputer.
At one time, minicomputers were used in a variety of applications. They served as communications controllers, instrument controllers, large system preprocessors, desktop calculators, and real-time data acquisition processors. But they also laid the foundation for significant advances in hardware architecture and made major contributions to modern operating systems, programming languages, and interactive computing as we know them today.
In today’s world of computing, in which every computer runs some version of Windows, Mac, or Linux, it’s hard to distinguish the CPUs that underlie the operating system. But there was a time when differences in CPU architecture mattered a lot. The PDP-11 helps explain why this is so.
The PDP-11 was introduced in 1970 when most computing was done on expensive GE, CDC and IBM mainframes that few had access to. There were no laptops, no desktops, no personal computers. Only a few companies were involved in programming, mostly in assembly language, COBOL and FORTRAN. Input was made with punched cards, and programs were launched by non-interactive batch runs.
Although the first PDP-11 was modest, it set the stage for the minicomputer invasion that made next-generation computers more affordable, essentially revolutionizing computing. The PDP-11 helped create the UNIX operating system and the C programming language. It would also greatly influence the next generation of computer architectures. In the 22 years of the PDP-11’s life – an unprecedented amount of time by today’s standards – more than 600,000 PDP-11s have been sold.
The early PDP-11s weren’t that impressive. The first 11/20 PDP-11 cost $20,000 but only came with 4 KB of RAM. It used paper tape as storage and had an ASR-33 teletype console that printed 10 characters per second. But it also had an amazing orthogonal 16-bit architecture, eight registers, 65 KB of address space, a 1.25 MHz cycle time, and a flexible UNIBUS hardware bus that supported future hardware peripherals. It was a winning combination for its creator, Digital Equipment Corporation.
The initial application for the PDP-11 included real-time hardware control, factory automation, and data processing. As the PDP-11 gained a reputation for flexibility, programmability, and affordability, it found use in traffic light control systems, Nike’s missile defense system, air traffic control, nuclear power plants, Navy pilot training systems, and telecommunications. He also pioneered the word processing and data processing that we now take for granted.
And the influence of the PDP-11 is most evident in the programming of the assembly of the device.
Assembly Programming Basics
Before the invention of high-level languages such as Python, Java, and Fortran, programming was done in assembly language. Assembly language programming can be done with very little RAM and disk space, ideal for the early days of computing.
Assembly language is a low-level intermediate format that is converted to machine language, which can then be run directly by the computer. It’s low-level because you directly control aspects of the computer’s architecture. Simply put, assembly language programming moves your data byte by byte through hardware registers and memory. What set PDP-11 programming apart was the elegant design of the minicomputer. Each instruction had its place, and each instruction had a meaning.
The 16-bit address space meant that each register could directly address up to 64 KB of RAM, with the top 4 KB reserved for memory-mapped input and output. PDP-11s could address a total of 128 KB of RAM using register segments (more on that in a moment). So even though the PDP-11 systems only shipped with 4 KB of RAM, they were still productive due to the clever use of early programming techniques.
Assembly program
The easiest way to understand this concept is with a simple PDP-11 assembly language program, which we’ll look at below. Keywords that start with “.”are directives for the assembler. .globl
exports the label as a symbol to the linker for use by the operating system. .text
defines the start of a code segment. .data
defines the start of a single data segment. Keywords ending in “:”are tags. Assembly language programming uses labels to symbolically address memory. (Note: with the advent of jargon and PDP-11 coding, any text after / is a comment.)
Keywords | Translation |
.globl_main | Export the _main label as an entry point for use by the operating system. |
.text | Start of instruction segment containing read-only code |
_main: ENGINE VALUE1, R0 | Copy the word value from memory location VAL1 to register 0. |
ADD $10, R0 | Add 10 to the value in register 0 |
MOTOR R0 VALUE1 | Copy the value from register 0 to memory location VAL1. |
_.data | The start of a data segment containing read/write data. |
VAL1:. word $100 | Reserve 2 bytes of memory to hold Val1 initialized to 100. |
Although you can use numeric values for memory addresses, using labels instead of hardcoded addresses simplifies programming and allows you to move code around in memory. This gives the operating system the flexibility to execute code, making each program fast and efficient.
assembler directive. data places data in a memory segment that is both readable and writable. The code memory segment is read-only to prevent programming errors from corrupting the program and causing crashes. This separation of instructions from data on the PDP-11 is called “separation of instructions and data”. In addition to improving stability, this feature also doubles the address space, providing 64 KB for code and 64 KB for data, which was considered an innovation at the time. Accordingly, the Intel X86 microcomputers later made extensive use of segments.